面试题 04.06. 后继者

面试题 04.06. 后继者

原始题目链接:https://leetcode-cn.com/problems/successor-lcci/
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。
在这里插入图片描述

解题思路:

解法一,利用二叉搜索树的性质,中序遍历的二叉搜索树是有序的序列,所以可以使用二分法进行解题。
解法二,比较好想,就是中序遍历二叉树的所有节点并且保存在一个数组中,在数组中查找要返回指定节点的索引,然后在数组中返回下一个节点即可。具体实现看代码及注释。

代码实现:

解法一

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
        # 答案初始化为空
        res = None
        # 当前遍历到的节点
        cur_node = root

        # 使用二分法,判断遍历到的当前节点的值和指定的值的大小
        while cur_node:
            # 当前遍历到的节点的值小于等于指定节点的值
            if cur_node.val <= p.val:
                cur_node = cur_node.right
            else:
                res = cur_node
                cur_node = cur_node.left
        return res

解法二

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def __init__(self):
        self.node_list = []

    # 中序遍历二叉搜索树工具函数
    def in_order(self, nodes, root):
        if root is None:
            return None
        self.in_order(nodes, root.left)
        nodes.append(root)
        self.in_order(nodes, root.right)


    def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
        if root is None:
            return None
        # 中序遍历二叉搜索树的节点,存储到数组中
        self.in_order(self.node_list, root)
        # 在中序遍历二叉树节点的数组中查找p的索引
        p_index = self.node_list.index(p)
        # 加个判断逻辑,返回p索引的下个节点就是题目要求返回的答案
        if p_index + 1 < len(self.node_list):
            return self.node_list[p_index + 1]
        else:
            return None

参考文献:
https://leetcode-cn.com/problems/successor-lcci/solution/er-fen-fa-olognshi-jian-o1kong-jian-by-ga-beng-cui/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值