1. 程式人生 > >Java資料結構:中根次序遍歷二叉排序樹

Java資料結構:中根次序遍歷二叉排序樹

        昨天離開了創新創業基地,有點難受,雖然換來了高效,但是總覺的難受,一起度過了半年,昨天離開了。

說正事,今天更新二叉排序樹的中根遍歷。

        思想:其實沒啥,類似與二叉樹的非遞迴中根遍歷,先找到最左邊的那個,由於二叉排序樹的特點,最左邊的那個為最小值,先通過first()方法,找到最左邊的那個,一直沿著p的左子樹往下走,一直走到p=null,返回最後一個p。然後又通過next()方法找下一個將要輸出的,這裡是中序遍歷的核心,這裡就有必要講一下中序遍歷了。

        

中序遍歷:先判斷其是否又右孩子,因為p從左子樹開始,如果有右子樹,則其下一個結點便是右子樹,因為中序遍歷,先從結點開始,發現有右孩子則判斷是否有孩子,如果沒有則列印,然後列印父母結點(此時是第二次遍歷到父母結點,第一次為從父母結點開始遍歷左子樹)然後到右子樹,,,,懂我意思吧。

      接著上文,如果p有右孩子則需要遍歷了p的右孩子才能回到p的父母節點,原理如上所述。

廢話少說---上程式碼

public void inorder() // 以中根次序遍歷二叉樹,輸出所有結點元素,非遞迴演算法
	{
		System.out.print("[");
		TriNode<T> p = this.first(this.root); // 尋找第一個訪問結點,最小值
		while (p != null) {
			System.out.print(p.data.toString() + " ");
			p = this.next(p); // 返回p在中根次序下的前驅結點
		}
		System.out.println("]");
	}

	// 在以p為根的子樹中,返回中根次序下第一個訪問結點,即是根的最左邊的子孫結點,最小值
	public TriNode<T> first(TriNode<T> p) {
		if (p != null)
			while (p.left != null)
				p = p.left;
		return p;
	}

	public TriNode<T> next(TriNode<T> p) // 返回p在中根次序下的後繼結點
	{
		if (p != null) {
			if (p.right != null) // 若p有右孩子,
				return this.first(p.right); // 則p的後繼是其右子樹第一個訪問結點
			while (p.parent != null) // 若p沒有右孩子,向上尋找某個祖先結點
			{
				if (p.parent.left == p) // 若p是其父母的左孩子,則p的後繼是其父母
					return p.parent;
				p = p.parent;
			}
		}
		return null;
	}