题解 | #二叉树的下一个结点#
二叉树的下一个结点
http://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e
题目给定结点,求按照中序遍历的顺序,它的下一个结点是什么,除了left和right指针外,还是指向父结点的next指针。
最容易想到的暴力解法:
1、根据next,找到根结点;
2、递归获得中序遍历序列;
3、找到给定的结点,输出下一个结点即可;
改进解法(我之前没注意pNode是给定结点,一直以为是根结点,浪费了大量时间)
找规律:
1、若右孩子存在,找右孩子中最左边的结点,没有则返回右孩子;
2、若右孩子不存在,那么就需要考虑父结点问题,父结点又分为左孩子和右孩子,两者是不一样的。若是父结点的左孩子,那么它的下一个结点为父结点,若不是,那么根据中序遍历,当前父结点已经遍历过了,只能向上找父结点的父结点。重复上述过程;
3、若是尾结点,输出nullptr;
代码:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(!pNode)
return NULL;
if(pNode->right){
pNode = pNode->right;
while(pNode->left){
pNode = pNode->left;
}
return pNode;
}
while(pNode->next){
TreeLinkNode* root = pNode->next;
if(root->left == pNode)
return root;
pNode = pNode->next;
}
return nullptr;
}
};