Java實現二叉樹建立及便遍歷
阿新 • • 發佈:2019-02-09
/** * 二叉樹是資料元素間具有層次關係的非線性結構,而且二叉樹每個結點的兩個子樹有 * 左右之分。 * 對於給定的一棵二叉樹,其先序/中序/後序遍歷是唯一確定的,但給定一種遍歷,無法 * 確定一棵二叉樹。先序/後序反應父結點與孩子結點層次關係,中序反應兄弟結點間左右次序 * */ public class BinaryTree {//二叉樹是有序樹,每個結點的兩棵子樹有左、右之分 TreeNode root;//根結點 private int size = 0;//樹的大小 public BinaryTree() {//無參構造 } /*有序樹求得最大值-最小值*/ public int getMax() { TreeNode node = root; while ( node.rightChild!=null) { node = node.rightChild; } return node.value; } public int getMin() { TreeNode node = root; while ( node.leftChild!=null) { node = node.leftChild; } return node.value; } /*得到二叉樹大小*/ public int getSize() { return this.size; } /*生成二叉樹*/ public void createBinaryTree( int [] data) {//傳入無序陣列構造二叉樹 for ( int i: data) { insertTree(i); } } public void insertTree( int data ) {//插入結點 if( root == null ) {//如果沒有根結點首先插入根結點 root = new TreeNode(data); } else {//判斷傳入的值和左右子樹關係 TreeNode cur = root; TreeNode parent; while ( true ) {//while(true)這個迴圈來找到目標插入位置 parent = cur; if ( data < cur.value ) { cur = parent.leftChild;//一直到左結點為葉子結點 if( cur == null ) { parent.leftChild = new TreeNode(data); break; } } else { cur = parent.rightChild;//一直到左結點為葉子結點 if( cur == null ) { parent.rightChild = new TreeNode(data); break; } } } } size++; } /*先序遞迴遍歷*/ public void preOrder(TreeNode node ) { if( node == null ) {//終止遞迴條件 return; } System.out.print( node.value + "--"); preOrder(node.leftChild ); preOrder(node.rightChild); } /*中序遞迴遍歷*/ public void midOrder(TreeNode node ) { if( node == null ) {//終止遞迴條件 return; } midOrder(node.leftChild ); System.out.print( node.value + "--"); midOrder(node.rightChild); } /*後序遞迴遍歷*/ public void postOrder(TreeNode node ) { if( node == null ) {//終止遞迴條件 return; } postOrder(node.leftChild ); postOrder(node.rightChild); System.out.print( node.value + "--"); } /*查詢*/ public boolean search( int data ) { boolean result = false; TreeNode node = root; while( true ) { if ( data == node.value) { result = true; break; } else if ( data < node.value ) { node = node.leftChild; if( node == null ) { break; } } else { node = node.rightChild; if( node == null ) { break; } } } return result; } } class TreeNode{ TreeNode leftChild; TreeNode rightChild; int value; public TreeNode(int data) {//構造有值結點 this.value = data; leftChild = null; rightChild = null; } }
測試結果:
控制檯輸出:<pre name="code" class="java">public class BinaryTreeTest { public static void main(String[] args) { BinaryTree tree = new BinaryTree(); int []data = {2,4,6,1,3,9,11,8,7}; tree.createBinaryTree(data); System.out.println("先序遍歷:"); tree.preOrder(tree.root); System.out.println(); System.out.println("中序遍歷:"); tree.midOrder(tree.root); System.out.println(); System.out.println("後序遍歷:"); tree.postOrder(tree.root); System.out.println(); System.out.println("查詢結果:"); System.out.println(tree.search(16)==false?"不存在":"存在"); } }
先序遍歷:
2--1--4--3--6--9--8--7--11--
中序遍歷:
1--2--3--4--6--7--8--9--11--
後序遍歷:
1--3--7--8--11--9--6--4--2--
查詢結果:
不存在