二叉樹定義及相關術語、節點數計算公式、代碼實現(遍歷,Java版)

二叉樹

定義:二叉樹是由n(n>=0)個節點組成的有限集,或者爲空樹(n=0),或者爲由一個根節點和兩個分別稱爲左子樹和右子樹的的互不相交的二叉樹構成。

特點:(1).每個節點最多能有兩棵子樹,即左子樹和右子樹。

             (2).左子樹和右子樹有次序之分,如

                                
                                                                       

                                                        圖1                                                                    圖2

                                                                   圖1和圖2是不同的二叉樹。

二叉排序樹

定義 : 二叉排序樹又叫二叉搜索樹,它首先是一棵二叉樹,而且滿足下列條件:

           (1)若左子樹不爲空,則左子樹所有節點的值均小於它的父節點的值。

           (2 ) 若右子樹不爲空,則右子樹所有節點的值均大於它的父節點的值。

           (3 ) 左、右子樹也分別爲二叉排序樹

術語:

(1)節點的度:一個節點含有的子樹的個數。

(2)葉節點:度爲零的節點。

(3)非葉節點:度不爲零的節點。

(4)父節點:一個節點包含子節點,則該節點稱爲父節點。

(5)兄弟節點:具有相同父節點的節點。

(6)節點的層次:根節點的層次爲1,根的子節點的層次爲2,以此類推。

(7)樹的高度或深度:樹中節點的最大層次。

(8)節點的祖先:從根節點到該節點所經的分支上的所有節點。

(9)滿二叉樹:一個深度爲k且節點數爲2^k-1的二叉樹。

(10)完全二叉樹:完全二叉樹是由滿二叉樹而引出來的。對於深度爲K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度爲K的滿二叉樹中編號從1至n的節點一一對應 時稱之爲完全二叉樹。

計算公式:

 (1) 在非空二叉樹中,第i層的結點總數不超過2^(i-1),i>=1; 

 (2) 深度爲h的二叉樹最多有2^h-1個結點(h>=1),最少有h個結點; 
 (3) 對於任意一棵二叉樹,如果其葉結點數爲N0,而度數爲2的結點總數爲N2,則N0=N2+1; 
 (4) 具有n個結點的完全二叉樹的深度爲K =[log2n」+1(取下整數) 
 (5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關係: 若I爲結點編號則 如果I>1,則其父結點的編號爲I/2; 
如果2*I<=N,則其左兒子(即左子樹的根結點)的編號爲2*I;若2*I>N,則無左兒子; 如果2*I+1<=N,則其右兒子的結點編號爲2*I+1;若2*I+1>N,則無右兒子。 (6)給定N個節點,能構成h(N)種不同的二叉樹。h(N)爲卡特蘭數的第N項。h(n)=C(2*n,n)/(n+1)。 


(以下代碼爲Java版)

二叉樹節點定義(BinaryTreeNode)

class BinaryTreeNode {
	int value;
	BinaryTreeNode t_left; // 左子樹
	BinaryTreeNode t_right;// 右子樹

	public BinaryTreeNode(int value) {
		this.value = value;
		this.t_left = null;
		this.t_right = null;

	}
}


二叉樹的遍歷(前中後序,深度,層次)

	/*
	 * 前序遍歷:首先訪問根節點,然後遍歷左子樹,最後遍歷右子樹
	 */
	public static void preOrder(BinaryTreeNode node) {
		if (node != null) {
			System.out.println(node.value);
			preOrder(node.left);
			preOrder(node.right);
		}
	}

	/*
	 * 中序遍歷:首先遍歷左子樹,然後訪問根節點,最後遍歷右子樹
	 */
	public static void inOrder(BinaryTreeNode node) {
		if (node != null) {
			inOrder(node.left);
			System.out.println(node.value);
			inOrder(node.right);
		}
	}

	/*
	 * 後序遍歷:首先遍歷左子樹,然後遍歷右子樹,最後訪問根節點
	 */
	public static void postOrder(BinaryTreeNode node) {
		if (node != null) {
			postOrder(node.left);
			postOrder(node.right);
			System.out.println(node.value);
		}
	}

	/*
	 * 層次遍歷
	 */
	public static void levelOrder(BinaryTreeNode node) {
		if (node != null) {
			Queue<BinaryTreeNode> queue = new LinkedList<BinaryTreeNode>();
			queue.add(node);
			while (!queue.isEmpty()) {
				BinaryTreeNode newNode = queue.poll();
				System.out.println(newNode.value);
				if (newNode.left != null)
					queue.add(newNode.left);
				if (newNode.right != null)
					queue.add(newNode.right);
			}
		}
	}

	/*
	 * 二叉樹深度:遞歸
	 */
	public static int getMathDepth(BinaryTreeNode node) {
		if (node == null)
			return 0;
		int left = getMathDepth(node.left);
		int right = getMathDepth(node.right);
		return 1 + Math.max(left, right);
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章