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

二叉树的下一个结点

http://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==NULL)
            return NULL;
        // 如果有右边的孩子 则返回的结果是右子树的最左下角
        if(pNode->right!=NULL)
        {
            pNode=pNode->right;
            while(pNode->left!=NULL)
                pNode=pNode->left;
            return pNode;
        }
        // 如果没有右孩子
        while(pNode->next!=NULL){
            TreeLinkNode *parent=pNode->next;
            // 如果是父亲的左孩子 则 结果是父结点
            if(parent->left==pNode){
                return parent;
            }
            // 如果不是父亲的左孩子 则是父亲的右孩子
            // 此时结果应该以父亲作为pNode重新在向上找
            // 考以下三种情况
            // 一种是描述的例子的i结点 它的下一个应该是a所以应当返回a
            //     因为它是父节点e的右孩子 再看e结点 是e的父节点b的右孩子
            //     直到到了b 是父节点的a的左孩子 所以应该返回a
            // 第二种情况 自己画一下图 把例子图里面b下面两个子树对调换一下
            //     因为i是父节点e的右孩子 所以应该看e
            //     因为e是父节点b的左孩子所以 应该返回a
            // 第三种情况看g
            //     g是父节点c的右孩子 c是父节点a的右孩子 此时a到了根节点了,再往上没有了,则代表g是最后一个结点了,返回NULL
            pNode=pNode->next;
        }
        /*返回的是二叉树最后一个结点*/
        return NULL;
    }
};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
06-27 12:30
延安大学 C++
实习+外包,这两个公司底层融为一体了,如何评价呢?
一表renzha:之前面了一家外包的大模型,基本上都能答出来,那面试官感觉还没我懂,然后把我挂了,我都还没嫌弃他是外包,他把我挂了……
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务