學習筆記 尋找二叉樹的前驅節點和後繼節點

2021-09-24 21:59:59 字數 2160 閱讀 5713

二叉樹前驅節點和後繼節點:乙個二叉樹中序遍歷中某個節點的前乙個節點叫該節點的前驅節點,某個節點的後乙個節點叫後繼節點

該題目中還有乙個節點指向節點的父節點 parent,規定頭節點的父親節點的指標為空。

struct treenode;
思路:

1)尋找前驅:若該節點存在左子樹,則其前驅節點為左子樹最右邊的節點;若該節點不存在左子樹,則利用parent指標向父節點找,若滿足該節點是其父節點的右節點,則該父節點為當前節點的前驅節點,若不滿足則更新父節點為祖父節點,當前節點更新為其父節點,直到滿足條件或者父節點為空,為空表示到達根節點依舊沒有找到。

2)尋找後繼:若該節點存在右子樹,則其後繼節點為右子樹最左邊的節點;若該節點不存在右子樹,則利用parent指標向父節點找,若滿足該節點是其父節點的左節點,則該父節點為當前節點的後繼節點,若不滿足則更新父節點為祖父節點,當前節點更新為其父節點,直到滿足條件或者父親節點為空,為空表示到達根節點依舊沒有找到。

1)尋找前驅節點:先理解前半句「若該節點存在左子樹,則其前驅節點為左子樹最右邊的節點」。下面這顆二叉樹的中序遍歷為 :

找到乙個存在左子樹的節點如1節點,那麼1節點的前驅節點為其左子樹最右邊的節點5,這是可行的。

下面理解後半部分「若該節點不存在左子樹,則利用parent指標向父節點找,若滿足該節點是其父節點的右節點,則該父節點為當前節點的前驅節點,若不滿足則更新父節點為祖父節點,當前節點更新為其父節點,直到滿足條件或者父節點為空,為空表示到達根節點依舊沒有找到」 我們找到乙個不存在左子樹的節點如6節點,如下圖所示,則當前節點為6節點,其父節點parent為3節點,6節點不是3節點的右節點,所以更新父節點為祖父節點,當前節點更新為其父節點,那麼當前節點為3節點,其父節點為1節點,滿足當前節點是其父節點的右節點,所以parent指向的節點為6的前驅

**實現:

treenode* getprenode(treenode* root) 

else

return father;//如果找到了就是滿足father->right == root,如果沒找到,則fathe指向null }}

treenode* lefttreemostright(treenode* p)

2)尋找後繼節點:先理解前半句「若該節點存在右子樹,則其後繼節點為右子樹最左邊的節點」,

下面這顆二叉樹的中序遍歷為 :

找到乙個存在右子樹的節點如1節點,那麼1節點的後繼節點為其右子樹最左邊的節點6,這是可行的。

下面理解後半部分

「若該節點不存在右子樹,則利用parent指標向父節點找,若滿足該節點是其父節點的左節點,則該父節點為當前節點的後繼節點,若不滿足則更新父節點為祖父節點,當前節點更新為其父節點,直到滿足條件或者父親節點為空,為空表示到達根節點依舊沒有找到」 我們找到乙個不存在右子樹的節點如6節點,如下圖所示,則當前節點為6節點,其父節點parent為3節點,6節點是3節點的左節點,滿足條件,所以3節點是6節點的後繼節點。

下面再考慮節點5,不存在右子樹,那麼更新如下圖所示,當前節點5不是父節點2的左節點,則向上更新當前節點和父節點;當前節點更新為節點2,其父節點更新為節點1,節點2是節點1的左節點,滿足當前節點是其父節點的左節點,所以父節點1為節點5的後繼節點。

**實現:

treenode* getpostnode(treenode* root) 

else

return father; }}

treenode* getrighttreemostleft(treenode* p)

左神課堂之尋找二叉樹的前驅節點和後繼節點

前驅節點 二叉樹中序遍歷完成後和這個節點相鄰的前面的節點為該節點的前驅節點 後繼節點 二叉樹中序遍歷完成後和這個節點相鄰的後面的節點為該節點的後繼節點 中序遍歷順序 8 4 9 2 10 5 1 6 3 7 4號節點的前驅節點為8號節點,後繼節點為9號節點。struct node struct no...

找到二叉樹的後繼節點(或前驅節點)

找到二叉樹的前驅節點 在二叉樹的中序遍歷中,乙個節點的後繼結點就是他的下乙個節點 想要找到任意乙個節點的後繼結點,二叉樹的節點型別node需要包含父節點的資訊 節點 struct node include include 節點 struct node void insert tree node ro...

二叉樹 在二叉樹中找到乙個節點的前驅節點

二叉樹 在二叉樹中找到乙個節點的後繼節點 可以將該結點分為兩種情況,1.沒有左子樹,那它是某乙個結點的右子樹的最左結點,然後找到這個右子樹的parent即可 找它的parent,直到當前節點是parent的右子樹為止 2.有左子樹,那前驅節點就是它的左子樹的最右結點 public static no...