劍指offer第8題,本來想找leetcode上對應的題,後來沒找到,直接去牛客網上刷了。
給定乙個二叉樹和其中的乙個結點(pnode),請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
我看到這道題的第乙個想法,就是不用管左子樹。因為中序遍歷,左子樹是之前訪問過了,所以下乙個節點只有兩種可能。
一、在右子樹
二、在父親節點的部分
分情況討論:
一、在右子樹
如果右子樹只有乙個節點那還好說,那麼下乙個節點就是右子節點。但是如果右子樹是乙個樹,那麼就得看右子樹的最左節點。
treelinknode * point=pnode->right;
while(point->left!=null)
return point;
二、在父親節點之上
若右子樹為空,此時分兩種情況。
(1)pnode是父親節點的左子節點,那正好,下乙個要訪問的就是父親節點,直接返回父親節點就行;
(2)pnode是父親節點的右子節點,說明下乙個節點所在的區域,還至少在父親節點的父親節點之上。
我一開始繞了個遠,第二種情況,我想到的是用遞迴解決。如果pnode是父親節點的右子節點,那麼就pnode=pnode->next;同時砍去父親節點的右子樹。這樣就構造了乙個子問題,把問題轉換成了給定父親節點之後,尋找訪問下乙個節點的問題。
if(pnode->right==null)
}
說的有點繞,整體思想就是砍去右子樹,讓指標指向父親,然後在新的樹里,尋找指標指向的節點要訪問的下乙個節點。其實我個人覺得還挺巧妙的。
不過還是把簡單問題複雜化了,其實直接一直往父親尋找就行,直到找到滿足情況(1)的pnode,返回pnode->next。
if(pnode->right==null)
最後放一下整體**:
/*
struct treelinknode
};*/
class solution
treelinknode * point=pnode->right;
while(point->left!=null)
return point;
}};
劍指 Offer 08 二叉樹的下乙個節點
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。解題思路 中序遍歷的順序是 左子樹 根節點 右子樹 因此有兩種情況 1 該節點有右子樹,那麼該節點中序遍歷的下乙個節點是右孩子的最左子節點 2 該節點沒有右...
劍指offer 08 二叉樹的下乙個結點
08.二叉樹的下乙個結點 給定乙個二叉樹和其中的乙個結點,請找出中序遍 歷順序的下乙個結點並且返回。注意,樹中的結點不僅包 含左右子結點,同時包含指向父結點的指標。根據中序遍歷的規則 先遞迴左子樹取左結點,取根結點,後遞迴右子樹取右結點 我們可以倒過來討論以下情況 1,如果結點 a,b,c,e 有右...
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...