理解 實現二叉樹的前驅結點問題

2021-09-17 22:26:08 字數 734 閱讀 1861

如果該節點存在前驅結點,前驅結點不可能存在右子樹,因為右子樹比前驅結點大,而前驅結點的定義是比該節點小的最大節點,也就是中序遍歷結果中在該節點前面乙個的結點。

1)先看該節點是否存在左子樹,如果存在直接找「左子樹 」中最大的就是他的前驅結點,這裡你可能有點不太理解,為什麼說他存在左子樹,前驅結點一定在他的左子樹呢?首先,我們驗證他的正確性 。結點左子樹比該節點小,我在左子樹中找到最大的結點,這滿足前驅的定義;那前驅節點為什麼不能是他的兄弟或者兄**樹呢,你這樣想,不妨設該節點是它父節點的右子樹(左子樹也一樣),他比父節點和兄弟結點都大,滿足前驅結點比該節點小的要求,但是,該節點的左子樹能在這個位置的原因是:他比該節點(所求結點)的父節點大,比該節點小;這說明了該節點的左子樹一定比他的父節點和他的兄弟結點大,所以說他的左子樹更符合前驅結點的特點。

2)如果該節點不存在左子樹,說明這時候他是沒有子樹的狀態,所以我們要往上找,往他的父節點找。這時候我們需要找到他的父節點,如果父節點的右子樹是該節點,皆大歡喜啊,因為這種情況下,他的父節點就是他的前驅結點啊;如果他是他父節點的左子樹,那父節點比該節點大,我們繼續往上找,操作是把該節點父節點設為當前節點,父節點是之前父節點的父節點,找啊找啊,直到出現轉折,之前是「丿」這樣的,直到 出現">",大於號的上面就是當前的父節點,他比「丿」任何乙個元素都小,所以這就是正解啦!~~~~

附上**:

bitree* predecenode(bitree* root,int value)

return parent;

}`

線索二叉樹(找前驅 後繼)

建立線索的初衷就是為了在乙個結點中能夠更方便找到前驅結點和後繼結點。中序線索二叉樹 先序線索二叉樹 後序線索二叉樹 找到以p為跟的子樹中,第乙個被中序遍歷的結點 threadnode firstnode threadnode p 在中序線索二叉樹中找到結點p的後繼結點 threadnode next...

二叉樹遍歷的前驅和後繼

下面關於二叉樹三種遍歷方法的前驅和後繼作討論和總結。一 前序遍歷1.1 找後繼 若有左子女,則後繼是左子女 若無左子女,有右子女,則後繼是右子女 若既無左子女,又無右子女,則是一片葉子 若是其父母的左子女,且父母有右子女,則後繼是父母的右子女。若是其父母的左子女,且父母無右子女 若是其父母的右子女。...

二叉樹結點, 排序

二叉樹結點,排序 1.二叉搜尋樹結點最小距離 給定乙個二叉搜尋樹的根結點 root,返回樹中任意兩節點的差的最小值 對這個序列相鄰相減,取最小值即可。實現時,可以優化掉這個序列。在遍歷時記錄上乙個訪問的節點值,和當前節點相減,記錄下最小值即可 定義樹節點 public class treenode ...