二叉树的下一个结点
2020.7.5
牛客链接
/*
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:
/*
1.如果是左子结点:
*/
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(!pNode) return nullptr;
if(!pNode->next){ //该结点是根节点,找右子树的最左结点
if(!pNode->right) return nullptr;
TreeLinkNode * p = pNode->right;
while(p->left) p = p->left;
return p;
}
if(pNode->next&&pNode->next->left==pNode) { //该节点是左子结点
if(pNode->right) { //有右子树,找右子树的最左的结点
TreeLinkNode * p = pNode->right;
while(p->left) p = p->left;
return p;
}
else return pNode->next; //没有右子树就返回父节点
}
else { //该节点是右子节点
if(pNode->right) {
TreeLinkNode * p = pNode->right;
while(p->left) p = p->left;
return p;
} else { //没有右子树,找祖先中第一个为左子结点的父结点
TreeLinkNode * p = pNode;
while(p->next&&p->next->right==p) p = p->next;
if(p->next&&p->next->left==p) return p->next;
else return nullptr;
}
}
}
};