二叉树的下一个结点(二叉树中序遍历的使用)

本文介绍了一种算法,用于寻找给定二叉树中指定结点在中序遍历下的下一个结点。提供了两种实现方法:一种通过递归获取整个中序遍历序列再查找;另一种采用循环遍历的方式,根据结点的右子树或父结点来确定下一个结点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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


题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。

第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,否则没有。

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        def Get_In_Order(root):
        	u"获取二叉树的中序遍历"
        	if root.left:
        		Get_In_Order(root.left)

        	res.append(root)
        	if root.right:
        		Get_In_Order(root.right)

        if not pNode:
        	return None

        temp = pNode

        # 获取根结点
        while temp.next:
        	temp = temp.next

        res = []
        Get_In_Order(temp) # 查找中序遍历序列
        for index, value in enumerate(res): # 遍历中序序列,找到下一个节点
        	if value == pNode:	
        		if index < len(res) - 1: # 需要查找的结点不是最后一个结点
        			return res[index + 1]

        return None

第二种方法,使用循环进行查找

两个方向进行讨论:

1.如果当前结点的右结点不为空,则往右结点方向进行遍历,如图所示

遍历到右结点以后,遍历右结点的左结点,一直到左结点的叶子结点

2.如果当前结点的右结点为空,则往上遍历,查找父结点,如果父结点的左子树等于给定结点的话,则该父结点就是要查找的结点,否则的话,则继续查找,要对每一步进行判断父结点的左子树是否等于给定结点,如果相等,则该结点就是要查找的结果,否则,当循环结束以后,则证明没有找到,返回None。


# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        if not pNode:
        	return None

        p = pNode
        if p.right:
        	if not p.right.left:
        		return p.right
        	pr = p.right
        	# 一直遍历该右结点的左子树,直到遍历到叶子结点,此时获得的结点就是pNode的下一个结点
        	# while循环的两个条件不能少,第一个是要得到的结果,第二个只有不为空的时候才能给pr赋值
        	while pr and pr.left:
        		pr = pr.left
        	return pr
        else:
        	if p.next:
        		# p结点是父结点的左子树上的结点,则直接返回父结点
        		if p.next.left == p:
        			return p.next

        		while p.next:
        			# 继续遍历父结点
        			# 这种情况的解释看图示
        			if p.next.left and p.next.left == p:
        				return p.next
        			p = p.next

        		return None



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值