每日算法题 | 剑指offer 二叉树专题 (12) 二叉树的下一个节点

点击上方“Jerry的算法和NLP”,选择“星标”公众号

      重磅干货,第一时间送达

 

题目


二叉树的下一个节点

题目要求

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

 

解题思路


   分析二叉树的下一个节点,一共有以下情况:

1.二叉树为空,则返回空;

2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;

(如图中A节点的中序遍历的下一个节点就是F)

3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;

(如图中D的下一个节点就是B)

否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。

(如图中E节点是B节点的右孩子,不满足情况,故往上查询是否存在左孩子的情况,结果为A)

Python :



class Solution:
    def GetNext(self, pNode):
        # write code here
        if pNode.right:#有右子树
            p=pNode.right
            while p.left:
                p=p.left
            return p
        while pNode.next:#无右子树,则找第一个当前节点是父节点左孩子的节点
            if(pNode.next.left==pNode):
                return pNode.next
            pNode = pNode.next#沿着父节点向上遍历
        return  #到了根节点仍没找到,则返回空

C++

/*
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 == nullptr)
            return nullptr;




        /* 寻找结果 */
        // 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点
        // 如果节点无右子节点,但该节点是其父节点的左子节点,则父节点是该节点的下一个节点
        // 如果节点无右子节点,且该节点是其父节点的右子节点,则沿着父节点向上遍历,满足XXX的父节点是其该节点的下一个节点
        TreeLinkNode * res = nullptr;
        if(pNode->right != nullptr)
        {
            TreeLinkNode* node_right = pNode->right;
            while(node_right ->left != nullptr)
            {
                node_right = node_right->left;
            }
            res = node_right;
        }




        else if(pNode->next != nullptr)
        {
            // 当前节点和当前节点的父节点
            TreeLinkNode * current = pNode;
            TreeLinkNode * parent = pNode->next;




            while(parent!=nullptr && current == parent->right)
            {
                current = parent;
                parent = parent ->next;
            }




            res = parent;
        }
        return res;
    }
};


JAVA

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 *proot=pNode->next;
            if(proot->left==pNode)
                return proot;
            pNode=pNode->next;
        }
        return NULL;
    }
};

后记

注:面试季来了,不管是作为面试者还是以后作为面试官,了解算法这门程序员之间的沟通方式都是非常必要的。找过工作的朋友应该都听说过《剑指offer》,虽然书中只有六十多道题目,但是道道都是经典。

  如果是单纯的面试需求,剑指offer的优先级肯定是在Leetcode之前,总的说它有三个优点:

  • 1.很可能在面试中出现原题

  • 2.约66题,题量少,但是涵盖的内容较全

  • 3.能培养一个良好的刷题习惯

它的缺点是:

  • 1.只有66题,刷着容易过拟合

  • 2.动态规划的题比较少,因此需要在Leetcode上专项训练。

算法题主要分成数据结构具体算法部分,简单归类如下。基本每道题都很精彩,所以这里就不一一洗写了,题解可以看看我的代码仓库或者讨论区的内容。

数据结构类题目

具体算法类题目

  • 斐波那契数列

    • 007-斐波拉契数列

    • 008-跳台阶

    • 009-变态跳台阶

    • 010-矩形覆盖

  • 搜索算法

    • 001-二维数组查找

    • 006-旋转数组的最小数字(二分查找)

    • 037-数字在排序数组中出现的次数(二分查找)

  • 全排列

    • 027-字符串的排列

  • 动态规划

    • 030-连续子数组的最大和

    • 052-正则表达式匹配(我用的暴力)

  • 回溯

    • 065-矩阵中的路径(BFS)

    • 066-机器人的运动范围(DFS)

  • 排序

    • 035-数组中的逆序对(归并排序)

    • 029-最小的K个数(堆排序)

    • 029-最小的K个数(快速排序)

  • 位运算

  • 其他算法

    • 002-替换空格

    • 013-调整数组顺序使奇数位于偶数前面

    • 028-数组中出现次数超过一半的数字

    • 031-整数中1出现的次数(从1到n整数中1出现的次数)

    • 032-把数组排成最小的数

    • 033-丑数

    • 041-和为S的连续正数序列(滑动窗口思想)

    • 042-和为S的两个数字(双指针思想)

    • 043-左旋转字符串(矩阵翻转)

    • 046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)

    • 051-构建乘积数组

剑指offer刷题交流群

扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。

 ▲长按加群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值