JZ57 二叉树的下一个节点*

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路

通过举例子不难发现以下几个规律:
(1) 节点为空指针,返回空指针
(2) 节点有右孩子,则返回它的右孩子的最左
(3) 节点没有右孩子:

  • 如果它是它父亲的左孩子,那就返回它的父亲
  • 如果它是它父亲的右孩子,那就看它的父亲的情况:它的父亲如果是左孩子,就返回父亲的父亲,如果它的父亲是右孩子,那就再往上看父亲的情况

这里要说一个树里比较常见的被忽视的问题:会经常有段错误的问题,一般都是因为越界了(就是对NULL取它的左/右/根了),在写->left的时候一定要注意看它的左会不会取到空

代码

/*
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;
        }
        //如果节点没有右子树,就要看是它父亲的左孩子还是右孩子;
        //如果是左孩子,就返回它的父节点;如果是右孩子,就要看它的父节点是左孩子还是右孩子(重复上面的操作)
        //TreeLinkNode* pFather=pNode->next;   //创建一个父节点,这个不是整棵树的根
        while(pNode->next!=NULL)
        {
            if(pNode->next->left==pNode)//如果父节点是左,就返回父节点的父节点
                return pNode->next;
            pNode=pNode->next;
        }
        //遍历到了最上面,也就是父节点现在是整个树的根节点
        return NULL;
    }
};
全部评论

相关推荐

10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务