《剑指Offer》-- 二叉树的下一个结点(Pyhton实现)

本文介绍了一种高效算法,用于确定给定二叉树节点在中序遍历下的下一个节点。主要分为两种情况:有右子树时,下一个节点是右子树的最左节点;无右子树时,依据节点与其父节点的关系确定。通过具体实例,清晰阐述了算法的实现过程。

题目:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点出了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针

结合图,可以将问题分成两大类:

1、该节点有右子树,那么下一个节点就是该节点的右子树中最左子节点,例如:b节点的下一个节点是h

2、该节点没有右子树

(1)该节点为父节点的左子节点,那么下一个节点是父节点。例如:d的下一个节点是b,f的下一个节点是c

(2)该节点为父节点的右子节点,那么下一个节点是沿着指向父节点的指针一直向上遍历,直到找到是它父节点的左子节点的节点。例如:i的下一个节点需要沿着父节点一直往上找,直到当前结点是其父节点的左孩子位置(b),那 i 的下一个节点就是 b 的父节点。

class TreeLinkNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        self.next = None

    def GetNext(pNode):
    
        # 传入空指针,返回None
        if not pNode:return None

        p = pNode
        # 有右子树,下一个节点就是右子树中最左节点
        if pNode.right:
            p = pNode.right
            while p.left:
                p = p.left
            return p

        # 没有右子树,但是有父亲节点,且该节点为父节点的右子树
        # 循环找到一个节点,该节点为它父节点的左子节点
        # 如果当前节点为左子节点,即 pNode.next.right != pNode ,则下一个节点就是父节点
        while pNode.next and pNode.next.right == pNode:
            pNode = pNode.next
        return pNode.next

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值