这个题虽然不是很难,提交了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; } };