Java資料結構:中根次序遍歷二叉排序樹
阿新 • • 發佈:2018-12-16
昨天離開了創新創業基地,有點難受,雖然換來了高效,但是總覺的難受,一起度過了半年,昨天離開了。
說正事,今天更新二叉排序樹的中根遍歷。
思想:其實沒啥,類似與二叉樹的非遞迴中根遍歷,先找到最左邊的那個,由於二叉排序樹的特點,最左邊的那個為最小值,先通過first()方法,找到最左邊的那個,一直沿著p的左子樹往下走,一直走到p=null,返回最後一個p。然後又通過next()方法找下一個將要輸出的,這裡是中序遍歷的核心,這裡就有必要講一下中序遍歷了。
接著上文,如果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; }