一般我們討論的二叉樹的結點結構只有:結點值、左兒子、右兒子。
但是如果在結點結構中加一個成員屬性,指向結點的父節點。那么又會引出不少的變化。
一:前繼結點與后繼結點
與鏈表不同,鏈表的前繼后繼就是根據結點在鏈表中的位置的前一結點、后一結點得出的。但是樹不同,結點的上一層與下一層都含有較多的結點,所以不能單純地由上下層關系定義前繼結點與后繼結點。
我們說的二叉樹結點的前繼結點、后繼結點是:在中序遍歷這棵二叉樹的結果中,該結點的前一結點是它的前繼結點、后一結點是后繼結點。
二:給出某一結點node,求node的后繼結點(該樹的結點包含父節點指針)【注:該題沒有給出樹的root結點】
傳統解法:由node的父節點不斷往上,找到root結點,然后從root開始中序遍歷樹得到中序遍歷結果,則中序遍歷結果中node的后面一個結點就是后繼結點。
優化解法:從中序遍歷的特性去尋找:左-根-右
中序遍歷一個結點時,下一個結點有三種情況:1:如果當前結點有右結點,則下一個遍歷的是右子樹的最左結點;
2:如果當前結點無右結點,若它是父節點的左兒子,則下一遍歷的是父節點;
3:如果當前結點無右結點,且它是父節點的右兒子,則所在子樹遍歷完了。向上尋找一個作為左兒子的祖先結點,那么下一遍歷的就是該祖先結點的父節點;(一直找到根節點為止)
如果上面三種情況都沒找到,則該節點是樹的最后一個結點,無后繼結點。