二叉樹的下一個結點
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;
}
}
}
};