题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点;
② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。
若该节点既没有右子树,且为其父节点的左子节点,则它的下一个结点就是它的父节点;
若该结点既没有右子树,且为其父节点的右子节点,则回溯至一个占据其父节点左子节点的结点,对应下一个结点为此节点的父节点。
参考答案
/*
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) {
if(!pNode) return nullptr;
TreeLinkNode *pNext = nullptr;
if(pNode->right) {
pNext = pNode->right;
while(pNext->left) pNext = pNext->left;
} else if(pNode->next) {
TreeLinkNode *pCurrent = pNode;
pNext = pNode->next;
while(pNext && pCurrent == pNext->right) {
pCurrent = pNext;
pNext = pNext->next;
}
}
return pNext;
}
};