【剑指offer】 二叉树的下一个节点(python)

题目描述:

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

解题思路:
根据当前节点求二叉树中序遍历的下一节点,需要分成几种情况进行求解:
1、若当前节点存在右节点,则直接返回当前节点的右节点下的最后一个左节点。

		if pNode.right:
            temp = pNode.right
             # 若存在右节点,则返回右节点的下的最后一个左节点
            while temp.left:
                temp = temp.left
            return temp
        # 求解根节点

2、判断当前节点是否存在父节点
2.1 若当前节点存在父节点
2.1.1、在存在父节点的情况下,判断当前节点是否是左节点,如果是左节点,则直接返回当前节点的父节点

			if pNode.next.left and (pNode.next.left == pNode):
                return pNode.next

2.1.2、在存在父节点的情况下,判断当前节点是否是右节点
2.1.2.1 判断当前节点是否是最后一个右节点,如果是树的最后一个右节点,返回空

				while root.right:
                    root = root.right
                    # 若当前节点是最后一个右节点,则返回空
                    if pNode == root:
                        return None

2.1.2.2 若当前节点不是树的最后一个右节点,返回当前节点的父节点的父节点

return pNode.next.next

2.2 若当前节点不存在父节点,则返回空

return 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 pNode.right:
            temp = pNode.right
             # 若存在右节点,则返回右节点的下的最后一个左节点
            while temp.left:
                temp = temp.left
            return temp
        # 求解根节点
        root = pNode
        while root.next:
            root = root.next
        # 判断父节点是否存在,即判断当前节点是否是根节点
        if pNode.next:
            # 在存在父节点的情况下,判断当前节点是否是左节点,
            # 如果是左节点,则直接返回当前节点的父节点
            if pNode.next.left and (pNode.next.left == pNode):
                return pNode.next
            # 在存在父节点的情况下,判断当前节点是否是右节点
            elif pNode.next.right and (pNode.next.right == pNode):
                # 判断当前节点是否是最后一个右节点
                while root.right:
                    root = root.right
                    # 若当前节点是最后一个右节点,则返回空
                    if pNode == root:
                        return None
                return pNode.next.next
        else:
            # 若当前节点的父节点不存在,则返回空
            return None
全部评论

相关推荐

11-27 17:35
已编辑
蚌埠坦克学院 C++
深信服 后台开发 n×12
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务