这个题虽然不是很难,提交了4次才算通过。有点汗颜,如果是面试可能就挂了,思路还是比较清楚的。
我们分情况讨论。
1.给出的节点存在右子节点的情况。比较好处理,也不需要回溯。dfs就可以搞定。就一直找到右边节点的中序遍历的第一个节点就可以了。
2.不满足1,但是它存在父节点。
分两种情况:
a.该父节点的右子树是它,它就变成了它父亲。然后一直寻亲上去。直到找到一个父节点左子树上挂的是该节点,走b。没找到就返回空。
b.该父节点的左子树是它,那么根据中序遍历,这个父节点就我们要找到的节点。
3.前面都不满足,没找到下一个节点。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode* res;
if(res != NULL){
return NULL;
}
if(pNode == NULL){
return NULL;
}
if(pNode->right != NULL){
return dfs(pNode->right);
}
while(pNode->next != NULL && pNode->next->right == pNode){
pNode = pNode->next;
}
if(pNode->next != NULL && pNode->next->left == pNode){
return pNode->next;
}
return NULL;
}
TreeLinkNode* dfs(TreeLinkNode* pNode){
if(pNode->left != NULL){
return dfs(pNode->left);
}
return pNode;
}
};



京公网安备 11010502036488号