剑指Offer刷题笔记——二叉树的下一个结点

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

1.每种数据结构的最小单元都是通过编程语言的类定义的,实际的数据结构就是由一个个类的实例组合成的。

2.二叉树的结构很特别,一个结点可以是父结点,也同时可以是子结点。一棵树的子树同样是二叉树。所以二叉树问题经常用到递归的方法。

3.前中后序遍历

   假如一个二叉树只有一个根结点,一个左结点,一个右结点。

   前序遍历:根结点->左子结点->右子结点

   中序遍历:左子结点->根结点->右子结点

   后序遍历:左子结点->右子结点->根结点  

但是如果二叉树没那么简单,以前序遍历为例,找到根节点之后,发现左结点还有自己的子结点。这时候在左结点再次按照前序遍历的规则从左结点开始,直到找到单一的结点。这个过程就是典型的递归。

class Node:

        def __init__(val):

            self.val = val

            self.left  = None

            self.right =  None

       def PreOrderTravel(head):

             print(head.val)

             PreOrderTravel(head.left)

             PreOrderTravel(head.right)

普适的遍历规则:

  • 前序遍历:根左右。先打印,再遍历左子树,再遍历右子树;
  • 中序遍历:左根右。先遍历左子树,再打印,再遍历右子树;
  • 后序遍历:左右根。先遍历左子树,再遍历右子树,再打印。

 这个题就是根据中序遍历,找某个节点的搜索到的下一个结点。

首先想到 就是如果一个结点有右子树的话,就接着遍历他的右子树就可以了。如果它没有右子树的话,按照中序遍历的规则,某一个结点被打印了,说明它的左子树已经遍历完了,所以左子树不用考虑了。本应该遍历右子树,却发现没有右子树。这时候就应该返回上一层了,这个结点作为它上面某个结点的子结点,而且必须是左子结点,因为只有遍历完左子树才打印子结点的父结点。如果是右子结点说明父结点已经被遍历完了,也就是说父结点这个子树遍历完了,所以下一个遍历就应该是父结点的父结点了,以此类推一次找爹之旅就开始了,直到找到一个结点是左子结点,本身向上搜索就说明被搜索的结点都是中序遍历过的,只要某个结点是左子结点,按照规则就该遍历父结点了。

class Solution:

     def GetNext(self,pNode):

# 判断是不是有右子树

           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 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值