1. 實現二叉樹的各種遍曆
package com.jzm.stackQueueTree;public class BinTree { private final static int MAX = 50; 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; } @Overridepublic 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 static void inOrder(BinTree parent){ if (parent == null) { return; } inOrder(parent.left); System.out.print(parent.data+" "); inOrder(parent.right); } //後序遍曆 public static 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 = 0; rear = 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++; }//end if }catch(Exception e){break; } } //end while } //求樹的高度 public int height(){ int height = 0; if(this ==null){ return -1; } int leftHeigt = ( (left == null)? 0:left.height() ); int rightHeigt=( (right ==null)?0:right.height() ); height = leftHeigt < rightHeigt ?rightHeigt:leftHeigt; return height+1; } //如果對象不在樹中,結果返回-1,否則返回對象在樹中的層次,規定根節點為第一層 public int level(Object object){ int levelTree =0; if(this == null){ return -1; } //規定根節點為第一層 if(object.equals(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; } levelTree = (leftLevel < rightLevel)? rightLevel:leftLevel; return levelTree+1; } //將樹中每一個節點的孩子對換位置 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; } } public static void main(String[] args) { 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("heigh="+tree.height()); 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("level(d)"+tree.level("B")); } }