java构建二叉树算法

Python011

java构建二叉树算法,第1张

//******************************************************************************************************//

//*****本程序包括简单的二叉树类的实现和前序,中序,后序,层次遍历二叉树算法,*******//

//******以及确定二叉树的高度,制定对象在树中的所处层次以及将树中的左右***********//

//******孩子节点对换位置,返回叶子节点个数删除叶子节点,并输出所删除的叶子节点**//

//*******************************CopyRight By phoenix*******************************************//

//************************************Jan 12,2008*************************************************//

//****************************************************************************************************//

public class BinTree {

public final static int MAX=40

private Object data//数据元数

private BinTree left,right//指向左,右孩子结点的链

BinTree []elements = new BinTree[MAX]//层次遍历时保存各个节点

int front//层次遍历时队首

int rear//层次遍历时队尾

public BinTree()

{

}

public BinTree(Object data)

{ //构造有值结点

this.data = data

left = right = null

}

public BinTree(Object data,BinTree left,BinTree right)

{ //构造有值结点

this.data = data

this.left = left

this.right = right

}

public String toString()

{

return data.toString()

}//前序遍历二叉树

public static void preOrder(BinTree parent){

if(parent == null)

return

System.out.print(parent.data+" ")

preOrder(parent.left)

preOrder(parent.right)

}//中序遍历二叉树

public void inOrder(BinTree parent){

if(parent == null)

return

inOrder(parent.left)

System.out.print(parent.data+" ")

inOrder(parent.right)

}//后序遍历二叉树

public void postOrder(BinTree parent){

if(parent == null)

return

postOrder(parent.left)

postOrder(parent.right)

System.out.print(parent.data+" ")

}// 层次遍历二叉树

public void LayerOrder(BinTree parent)

{

elements[0]=parent

front=0rear=1

while(front<rear)

{

try

{

if(elements[front].data!=null)

{

System.out.print(elements[front].data + " ")

if(elements[front].left!=null)

elements[rear++]=elements[front].left

if(elements[front].right!=null)

elements[rear++]=elements[front].right

front++

}

}catch(Exception e){break}

}

}//返回树的叶节点个数

public int leaves()

{

if(this == null)

return 0

if(left == null&&right == null)

return 1

return (left == null ? 0 : left.leaves())+(right == null ? 0 : right.leaves())

}//结果返回树的高度

public int height()

{

int heightOfTree

if(this == null)

return -1

int leftHeight = (left == null ? 0 : left.height())

int rightHeight = (right == null ? 0 : right.height())

heightOfTree = leftHeight<rightHeight?rightHeight:leftHeight

return 1 + heightOfTree

}

//如果对象不在树中,结果返回-1否则结果返回该对象在树中所处的层次,规定根节点为第一层

public int level(Object object)

{

int levelInTree

if(this == null)

return -1

if(object == data)

return 1//规定根节点为第一层

int leftLevel = (left == null?-1:left.level(object))

int rightLevel = (right == null?-1:right.level(object))

if(leftLevel<0&&rightLevel<0)

return -1

levelInTree = leftLevel<rightLevel?rightLevel:leftLevel

return 1+levelInTree

}

//将树中的每个节点的孩子对换位置

public void reflect()

{

if(this == null)

return

if(left != null)

left.reflect()

if(right != null)

right.reflect()

BinTree temp = left

left = right

right = temp

}// 将树中的所有节点移走,并输出移走的节点

public void defoliate()

{

String innerNode = ""

if(this == null)

return

//若本节点是叶节点,则将其移走

if(left==null&&right == null)

{

System.out.print(this + " ")

data = null

return

}

//移走左子树若其存在

if(left!=null){

left.defoliate()

left = null

}

//移走本节点,放在中间表示中跟移走...

innerNode += this + " "

data = null

//移走右子树若其存在

if(right!=null){

right.defoliate()

right = null

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

BinTree e = new BinTree("E")

BinTree g = new BinTree("G")

BinTree h = new BinTree("H")

BinTree i = new BinTree("I")

BinTree d = new BinTree("D",null,g)

BinTree f = new BinTree("F",h,i)

BinTree b = new BinTree("B",d,e)

BinTree c = new BinTree("C",f,null)

BinTree tree = new BinTree("A",b,c)

System.out.println("前序遍历二叉树结果: ")

tree.preOrder(tree)

System.out.println()

System.out.println("中序遍历二叉树结果: ")

tree.inOrder(tree)

System.out.println()

System.out.println("后序遍历二叉树结果: ")

tree.postOrder(tree)

System.out.println()

System.out.println("层次遍历二叉树结果: ")

tree.LayerOrder(tree)

System.out.println()

System.out.println("F所在的层次: "+tree.level("F"))

System.out.println("这棵二叉树的高度: "+tree.height())

System.out.println("--------------------------------------")

tree.reflect()

System.out.println("交换每个节点的孩子节点后......")

System.out.println("前序遍历二叉树结果: ")

tree.preOrder(tree)

System.out.println()

System.out.println("中序遍历二叉树结果: ")

tree.inOrder(tree)

System.out.println()

System.out.println("后序遍历二叉树结果: ")

tree.postOrder(tree)

System.out.println()

System.out.println("层次遍历二叉树结果: ")

tree.LayerOrder(tree)

System.out.println()

System.out.println("F所在的层次: "+tree.level("F"))

System.out.println("这棵二叉树的高度: "+tree.height())

}

java构造二叉树,可以通过链表来构造,如下代码:

public class BinTree {

public final static int MAX=40

BinTree []elements = new BinTree[MAX]//层次遍历时保存各个节点

    int front//层次遍历时队首

    int rear//层次遍历时队尾

private Object data //数据元数

private BinTree left,right //指向左,右孩子结点的链

public BinTree()

{

}

public BinTree(Object data)

{ //构造有值结点

   this.data = data

   left = right = null

}

public BinTree(Object data,BinTree left,BinTree right)

{ //构造有值结点

   this.data = data

   this.left = left

   this.right = right

}

public String toString()

{

   return data.toString()

}

//前序遍历二叉树

public static void preOrder(BinTree parent){ 

     if(parent == null)

      return

     System.out.print(parent.data+" ")

     preOrder(parent.left)

     preOrder(parent.right)

}

//中序遍历二叉树

public void inOrder(BinTree parent){

   if(parent == null)

      return

   inOrder(parent.left)

   System.out.print(parent.data+" ")

     inOrder(parent.right)

}

//后序遍历二叉树

public void postOrder(BinTree parent){

   if(parent == null)

    return

   postOrder(parent.left)

   postOrder(parent.right)

   System.out.print(parent.data+" ")

}

// 层次遍历二叉树 

public void LayerOrder(BinTree parent)

     elements[0]=parent

     front=0rear=1

   while(front<rear)

   {

    try

    {

        if(elements[front].data!=null)

        {

           System.out.print(elements[front].data + " ")

           if(elements[front].left!=null)

          elements[rear++]=elements[front].left

           if(elements[front].right!=null)

          elements[rear++]=elements[front].right

           front++

        }

    }catch(Exception e){break}

   }

}

//返回树的叶节点个数

public int leaves()

{

   if(this == null)

    return 0

   if(left == null&&right == null)

    return 1

   return (left == null ? 0 : left.leaves())+(right == null ? 0 : right.leaves())

}

//结果返回树的高度

public int height()

{

   int heightOfTree

   if(this == null)

    return -1

   int leftHeight = (left == null ? 0 : left.height())

   int rightHeight = (right == null ? 0 : right.height())

   heightOfTree = leftHeight<rightHeight?rightHeight:leftHeight

   return 1 + heightOfTree

}

//如果对象不在树中,结果返回-1否则结果返回该对象在树中所处的层次,规定根节点为第一层

public int level(Object object)

{

   int levelInTree

   if(this == null)

    return -1

   if(object == data)

    return 1//规定根节点为第一层

   int leftLevel = (left == null?-1:left.level(object))

   int rightLevel = (right == null?-1:right.level(object))

   if(leftLevel<0&&rightLevel<0)

    return -1

   levelInTree = leftLevel<rightLevel?rightLevel:leftLevel

   return 1+levelInTree

  

}

//将树中的每个节点的孩子对换位置

public void reflect()

{

   if(this == null)

    return

   if(left != null)

    left.reflect()

   if(right != null)

    right.reflect()

   BinTree temp = left

   left = right

   right = temp

}

// 将树中的所有节点移走,并输出移走的节点

public void defoliate()

{

   if(this == null)

    return

   //若本节点是叶节点,则将其移走

   if(left==null&&right == null)

   {

    System.out.print(this + " ")

    data = null

    return

   }

   //移走左子树若其存在

   if(left!=null){

    left.defoliate()

    left = null

   }

   //移走本节点,放在中间表示中跟移走...

   String innerNode += this + " "

   data = null

   //移走右子树若其存在

   if(right!=null){

    right.defoliate()

    right = null

   }

}

   /**

* @param args

*/

public static void main(String[] args) {

   // TODO Auto-generated method stub

   BinTree e = new BinTree("E")

   BinTree g = new BinTree("G")

   BinTree h = new BinTree("H")

   BinTree i = new BinTree("I")

   BinTree d = new BinTree("D",null,g)

  

   BinTree f = new BinTree("F",h,i)

   BinTree b = new BinTree("B",d,e)

   BinTree c = new BinTree("C",f,null)

   BinTree tree = new BinTree("A",b,c)

  

        System.out.println("前序遍历二叉树结果: ")

        tree.preOrder(tree)

        System.out.println()

        System.out.println("中序遍历二叉树结果: ")

        tree.inOrder(tree)

        System.out.println()

        System.out.println("后序遍历二叉树结果: ")

        tree.postOrder(tree)

        System.out.println()

      System.out.println("层次遍历二叉树结果: ")

     tree.LayerOrder(tree)

     System.out.println()

        System.out.println("F所在的层次: "+tree.level("F"))

        System.out.println("这棵二叉树的高度: "+tree.height())

         System.out.println("--------------------------------------")

         tree.reflect()

          System.out.println("交换每个节点的孩子节点后......")

          System.out.println("前序遍历二叉树结果: ")

        tree.preOrder(tree)

        System.out.println()

        System.out.println("中序遍历二叉树结果: ")

        tree.inOrder(tree)

        System.out.println()

        System.out.println("后序遍历二叉树结果: ")

        tree.postOrder(tree)

        System.out.println()

      System.out.println("层次遍历二叉树结果: ")

     tree.LayerOrder(tree)

     System.out.println()

        System.out.println("F所在的层次: "+tree.level("F"))

        System.out.println("这棵二叉树的高度: "+tree.height())

}

二叉树的相关操作,包括创建,中序、先序、后序(递归和非递归),其中重点的是java在先序创建二叉树和后序非递归遍历的的实现。

package com.algorithm.tree

import java.io.File

import java.io.FileNotFoundException

import java.util.Queue

import java.util.Scanner

import java.util.Stack

import java.util.concurrent.LinkedBlockingQueue

public class Tree {

private Node root

public Tree() {

}

public Tree(Node root) {

this.root = root

}

//创建二叉树

public void buildTree() {

Scanner scn = null

try {

scn = new Scanner(new File("input.txt"))

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

root = createTree(root,scn)

}

//先序遍历创建二叉树

private Node createTree(Node node,Scanner scn) {

String temp = scn.next()

if (temp.trim().equals("#")) {

return null

} else {

node = new Node((T)temp)

node.setLeft(createTree(node.getLeft(), scn))

node.setRight(createTree(node.getRight(), scn))

return node

}

}

//中序遍历(递归)

public void inOrderTraverse() {

inOrderTraverse(root)

}

public void inOrderTraverse(Node node) {

if (node != null) {

inOrderTraverse(node.getLeft())

System.out.println(node.getValue())

inOrderTraverse(node.getRight())

}

}

//中序遍历(非递归)

public void nrInOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

while (node != null || !stack.isEmpty()) {

while (node != null) {

stack.push(node)

node = node.getLeft()

}

node = stack.pop()

System.out.println(node.getValue())

node = node.getRight()

}

}

//先序遍历(递归)

public void preOrderTraverse() {

preOrderTraverse(root)

}

public void preOrderTraverse(Node node) {

if (node != null) {

System.out.println(node.getValue())

preOrderTraverse(node.getLeft())

preOrderTraverse(node.getRight())

}

}

//先序遍历(非递归)

public void nrPreOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

while (node != null || !stack.isEmpty()) {

while (node != null) {

System.out.println(node.getValue())

stack.push(node)

node = node.getLeft()

}

node = stack.pop()

node = node.getRight()

}

}

//后序遍历(递归)

public void postOrderTraverse() {

postOrderTraverse(root)

}

public void postOrderTraverse(Node node) {

if (node != null) {

postOrderTraverse(node.getLeft())

postOrderTraverse(node.getRight())

System.out.println(node.getValue())

}

}

//后续遍历(非递归)

public void nrPostOrderTraverse() {

Stack<Node>stack = new Stack<Node>()

Node node = root

Node preNode = null//表示最近一次访问的节点

while (node != null || !stack.isEmpty()) {

while (node != null) {

stack.push(node)

node = node.getLeft()

}

node = stack.peek()

if (node.getRight() == null || node.getRight() == preNode) {

System.out.println(node.getValue())

node = stack.pop()

preNode = node

node = null

} else {

node = node.getRight()

}

}

}

//按层次遍历

public void levelTraverse() {

levelTraverse(root)

}

public void levelTraverse(Node node) {

Queue<Node>queue = new LinkedBlockingQueue<Node>()

queue.add(node)

while (!queue.isEmpty()) {

Node temp = queue.poll()

if (temp != null) {

System.out.println(temp.getValue())

queue.add(temp.getLeft())

queue.add(temp.getRight())

}

}

}

}

//树的节点

class Node {

private Node left

private Node right

private T value

public Node() {

}

public Node(Node left,Node right,T value) {

this.left = left

this.right = right

this.value = value

}

public Node(T value) {

this(null,null,value)

}

public Node getLeft() {

return left

}

public void setLeft(Node left) {

this.left = left

}

public Node getRight() {

return right

}

public void setRight(Node right) {

this.right = right

}

public T getValue() {

return value

}

public void setValue(T value) {

this.value = value

}

}

测试代码:

package com.algorithm.tree

public class TreeTest {

/**

* @param args

*/

public static void main(String[] args) {

Tree tree = new Tree()

tree.buildTree()

System.out.println("中序遍历")

tree.inOrderTraverse()

tree.nrInOrderTraverse()

System.out.println("后续遍历")

//tree.nrPostOrderTraverse()

tree.postOrderTraverse()

tree.nrPostOrderTraverse()

System.out.println("先序遍历")

tree.preOrderTraverse()

tree.nrPreOrderTraverse()

//

}

}