题解 | 二叉树的下一个结点

二叉树的下一个结点

https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

/*
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;
        if(pNode->right){
            TreeLinkNode* cur = pNode->right;
            while(cur->left){
                cur = cur->left;
            }
            return cur;
        }
        while(pNode){//别忘了首位处理,可能没有上一个,空指针没有元素不能访问。
            if(pNode->next&&pNode->next->left==pNode) return pNode->next;
            pNode = pNode->next;
        }
        return nullptr;
    }
};

其他方法:中序遍历下一位最简单就是直接找到根节点然后中序遍历一次,然后找到要求节点的下一位。

唯一需要注意的一点就是保存为指针,因为需要比较本质上是不是同一个,也就是地址,地址比较用指针比较。

本题方法:

我给出的方法是直接通过中序遍历的规律找,中序就是左中右。

这个中是指自己,从中序遍历的递归函数的写法就可以看出来,在左右递归中间写当前节点的处理代码。

所以它左边肯定已经搞完了,下一步要往右边走,如果有右子树那就是右子树里最左的部分。

如果没有右子树呢?那也要往右边走,但是它自己不会再作为根节点了,而是一个更大的树的左边部分(因为那个根不是这个节点,只能在上面,又不能是右边部分,因为作为右子树已经完蛋了必须依靠外界),所以一直往上找到自己是左子树的部分,返回那个大树的根节点。

为什么优先自己走呢?因为本节点必然是大树的左树,而左树整颗都在大树根节点的左边,往右走时会先走到此节点的右子树。

全部评论

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务