剑指offer:Python 二叉树的下一结点

题目描述

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

思路及Python实现

  • 理一下题目,画出大致示意1;再看要求的中序遍历的下一个结点,如下图2,观察中序遍历的输出顺序!
    在这里插入图片描述
    在这里插入图片描述
  • 如果pNode是一个左结点,那么它的下一个结点永远是它的父结点,所以要利用这一特性;如果pNode是位于一个“父结点”上,那么它的下一个结点会有两种情况:一是,如果右结点存在,那么下一个结点就是,不断去找到它的左子树的最后一层左结点(如果多没有,最上一层就是当前存在的右节点);如果右结点不存在,那么下一个结点就是当前父结点的上一个位于左子树的父结点,一定是是不断向上找左侧的,如果只有一层,那就只能是只存在根结点root,那么它不存在下一个!
  • 所以具体做法是:先判断给出的pNode存在右结点的情况,然后处理它不存在的情况
class TreeLinkNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        self.next = None


class Solution:
    def GetNext(self, pNode):
        if pNode.right:
            temp_node = pNode.right
            while temp_node.left:
                temp_node = temp_node.left
            return temp_node
        else:
            temp_node = pNode
            while temp_node.next: # 通过指针找到它的父结点
                if temp_node.next.left == temp_node: # 如果父结点的左侧就是给的结点,直接返回
                    return temp_node.next
                temp_node = temp_node.next # 如果没有找到位于左侧的父结点,就一直找
            return None # 只有一个根root的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值