1. 程式人生 > >Java實現二叉樹建立及便遍歷

Java實現二叉樹建立及便遍歷

/**
 * 二叉樹是資料元素間具有層次關係的非線性結構,而且二叉樹每個結點的兩個子樹有
 * 左右之分。
 * 對於給定的一棵二叉樹,其先序/中序/後序遍歷是唯一確定的,但給定一種遍歷,無法
 * 確定一棵二叉樹。先序/後序反應父結點與孩子結點層次關係,中序反應兄弟結點間左右次序
 * */
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--
查詢結果:
不存在