JZ57 二叉树的下一个结点 python

本文详细介绍了如何在二叉树中寻找一个节点的中序遍历下一个节点,包括三种情况的讨论:节点有右子树、节点为父节点的左节点以及节点为父节点的右节点。同时,文中提到了错误记录,如未考虑最后一个节点的情况和根节点为最后一个节点的情况,并给出了优化后的解决方案。文章通过具体的代码实现,帮助读者理解这一算法。
摘要由CSDN通过智能技术生成

JZ57 二叉树的下一个结点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
book method
画图找规律,在中序遍历中寻找该节点的下一个节点分如下三类讨论:

  1. 节点有右子树
    找到其右子树的最左子节点为中序遍历的下一节点
  2. 节点无右子树,且为父节点的左节点
    其父节点为中序遍历的下一节点
  3. 节点无右子树,且为父节点的右节点
    往上找父节点,直到该节点位于某个父节点的左子树,则这个父节点为中序遍历的下一节点

错误记录

  1. 未考虑情况3中找不到所需父节点的情况(即为最后一个节点){8,6,10,5,7,9,11},11
  2. 未考虑根节点为中序遍历最后一个节点的情况{5,4,#,3,#,2},5
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:
            # 节点有右子树
            p = pNode.right
            while p:
                if p.left:
                    p = p.left
                else:
                    return p
        else:
            # 节点无右子树
            if pNode.next:
                parent = pNode.next
                if pNode == parent.left:
                    # 节点为父节点的左节点
                    return parent
                else:
                    # 节点为父节点的右节点
                    while parent.next and parent != parent.next.left:
                        parent = parent.next
                return parent.next

优化

class Solution:
    def GetNext(self, pNode):
        # write code here
        # 此节点有右子树
        if pNode.right:
            temp = pNode.right
            while temp:
                result = temp
                temp = temp.left
            return result
        # 此节点没有右子树
        while pNode:
            if pNode.next:
                if pNode.next.left == pNode:
                    return pNode.next
                pNode = pNode.next
            else:
                return None

注意特殊二叉树的样例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值