(python)小菜狗算法日记(二叉树系列)_leetcode 面试题68 - I. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

写这道题的时候忘了之前是怎么写的了,现在脑子里碰到二叉树就是那几种遍历。思路是用前序,因为是搜索二叉树,左边小于中间小于右边。如果一个节点被p和q夹在中间,那这个节点就是他们的公共祖先。

迭代:

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

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return 
        stack = [root]
        while stack:
            node = stack.pop()
            if p.val<=node.val and q.val>=node.val: #有等的情况
                return node
            elif p.val>=node.val and q.val<=node.val: #因为不晓得q和p哪个大哪个小,所以写个elif
                return node
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)

这种思路的递归没写出来,因为有些感觉不需要遍历,还有就是不好return,晓得咋写的麻烦评论告诉我。

以前的思路:感觉有点像前序又不是,因为遍历的时候不用像前序一样回溯。直接往下找就行了。如果两个都小于当前根就往左找,两个都大于当前根就往右找。否则公共祖先就是当前根。

迭代:

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

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return
        while root:
            if p.val<root.val and q.val<root.val:
                root = root.left
            elif p.val>root.val and q.val>root.val:
                root = root.right
            else:
                return root

递归:

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

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        def loop(root):
            if not root:
                return
            if p.val<root.val and q.val<root.val:
                return loop(root.left)
            elif p.val>root.val and q.val>root.val:
                return loop(root.right)
            else:
                return root
        return loop(root)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值