剑指offer实践 ——8.二叉树的下一个节点(python版)

题目

在这里插入图片描述

思路

本题需要理解二叉树中序遍历:左->中->右。
在对二叉树进行中序遍历时,可以总结出如下几种情况:
一:
当前节点有右子树。
遵循【左->中->右】的顺序,它的左子树已遍历完成,作为根节点它也已遍历过,因此它的下一个节点在它的右子树中。在当前节点的右子树中进行树的中序遍历,第一个节点就是当前节点的下一个节点。
在这里插入图片描述
例: 节点 b 的下一个节点就是 h,节点 a 的下一个节点就是 f。

二:
当前节点没有右子树。
这个情况下有两种情况。
a.当前节点是它父节点的左节点,那么它的下一个节点就是它的父节点。
例: 节点 d 的下一个节点就是 b,节点f的下一个节点就是 c。
b.当前节点是它父节点的右节点,沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左节点的节点。如果存在这样的节点,那么这个节点的父节点就是下一个节点。
例:i的下一个节点是a节点

二叉树的定义

class Binary_Tree():

    def __init__(self, root=None, left=None, right=None, parent=None):
        self.root = root
        self.left = left
        self.right = right
        self.parent = parent

题解

def find_next_node(pNode):
    # 是否非空节点
    if not pNode:
        return None
    p_parent = pNode.parent
    # 是否有右子树
    if pNode.right:
        pNode = pNode.right
        while pNode.left:
            # 当前的左子树的叶子
            pNode = pNode.left
        return pNode
    else:
        # 如果当前节点是它父节点的左子树
        if p_parent and p_parent.left == pNode:
            return p_parent
        elif p_parent and p_parent.right == pNode:
            while p_parent.parent:
                if p_parent.parent.left == p_parent:
                    return p_parent.next
                else:
                    p_parent = p_parent.next

如果有问题,欢迎大家指出哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值