剑指offer 寻找二叉树的下一个节点 python

题目描述

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

 

方法一:

根据题意,既然是找出中序遍历的下一个节点,那就先进行中序遍历,将节点存于数组,返回要求节点的下一个节点即可,注意若要求节点为最后一个节点,则返回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):
        self.res = []
        dummy = pNode
        while dummy.next:
            dummy = dummy.next
        self.mid_travel(dummy)
        for i in range(len(self.res)):
            if self.res[i] == pNode:
                if i < len(self.res) -1:
                    return self.res[i+1]
                else:
                    return None
                 
    def mid_travel(self, root):
        if not root:
            return
        self.mid_travel(root.left)
        self.res.append(root)
        self.mid_travel(root.right)

方法二:

根据分析可以得出思路:

第一种情况:要求节点有右子树,则返回右子树的最左节点

(如上图,如果要求节点为A,则返回F节点)

第二种情况:要求节点无右子树,向父节点遍历,直到寻找到某个节点的父节点的左子树为该节点的节点,若没有找到,则返回None

(如上图,如果要求节点为I,则返回A节点,因为一直向上寻找父节点,当寻找到B节点时,B的父节点的左子树为B节点,所有返回B.next)

(如上图,如果要求节点为G,找不到,所有返回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):
        # 有右子树,下一节点为右子树的最左节点
        if pNode.right:
            p = pNode.right
            while p.left:
                p = p.left
            return p
        # 无右子树,寻找某个节点的父节点的左子树为该节点的节点
        while pNode.next:
            if pNode.next.left == pNode:
                return pNode.next
            pNode = pNode.next
        # 未找到符合要求的节点
        return 

-------------------------------------------------------------------------------------------------------------------------------------

更多题目包括leetcode、牛客网、各种排序算法解法参见个人GitHub,持续更新中,欢迎star ~~

https://github.com/PemLer/Journey_of_leetcode

-------------------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值