给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
规律:1. 如果有右儿子,下一个是右儿子最左边的节点‘
2. 如果没有右儿子
(1) 如果是父亲节点的左儿子,下一个是父亲节点。
(2) 如果一个节点没有右子树,且它是父节点的右子结点,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子结点的节点。如果这个节点存在,则它的父节点是我们要找的节点。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode){
if(pNode==NULL) return NULL;
if(pNode->right){
auto qNode = pNode->right;
while(qNode->left!=NULL){
qNode = qNode->left;
}
return qNode;
}
else if(pNode->next!=NULL){
auto q = pNode;
auto pParent = pNode->next;
while(pParent!=NULL&&q==pParent->right) {
q = pParent;
pParent = pParent->next;
}
return pParent;
}else{
return NULL;
}
}
};