剑指offer 08. 二叉树的下一个节点

2020年11月17日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】


在这里插入图片描述
题意很明确,就是找中序遍历指定结点的下个结点,而且给出了指向父结点的指针。

分类讨论:

  1. 当前结点有右子树,下个结点为右子树的最左结点;
  2. 当前结点无右子树,则向上查找,直到找到左孩子(如果是右孩子,说明父结点已经遍历过了),下个结点为左孩子的父结点。
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
     if ( pNode -> right ) //有右子树时,下个结点即为右子树的最左结点
     {
        BinaryTreeNode* t = pNode -> right ; //右子树
         while ( t -> left )
            t = t -> left ;
         return t ;
     }
     else //无右子树时,返回父结点(向上查找,下个结点为左孩子的父结点)
     {
        BinaryTreeNode * par = pNode -> parent ; // 父结点
         while ( par && par -> right == pNode ) // 如果当前结点是父结点的右孩子,说明父结点已经遍历过了,继续向上遍历,直到当前结点为左结点
         {
            pNode = par ;
            par = par -> parent ;
         } // 退出时,当前结点为父结点的左孩子,所以下个结点就是当前结点的父结点
         return par ; // 返回父结点
     }
}

参考文献
《剑指offer 第二版》
https://blog.csdn.net/kk55guang2/article/details/86179012

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值