Leecode_BTS二叉搜索树寻找最近祖先 题解

简介: Leecode_BTS二叉搜索树寻找最近祖先 题解

235.二叉搜索树的最近祖先


问题描述:


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


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


个人分析:首先学到了它的性质来源百科:若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树


eb5fb5c051244f1983fe3db6c283901d.jpg


对于结点root,p,q 大小关系存在三种(不妨令p<q)


1.root>q and root>p


2:root<q and root<p


3:p<root<q


先考虑3情况:思考这样一个问题 当满足3条件时 由小郑的笔记可知,root一定是p,q的祖先


那root一定是其最近祖先吗?


我们可用反证法解释:如果不是,那么假设最近祖先为root0,它必然不会出现在root的子树上(笔记上有说明,集合B,C中的元素有且仅有这一个公共祖先),那么它就只能出现在root以上,如果出现在root以上,深度就半小了,就不是最近祖先了,与题意要求不符。


所以如果出现了情况3 一定就是最近祖先的情况


所以情况3就是基线条件,情况1和2就是递归条件,下面呈现代码

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        # print(root)
        if p.left==q or p.right==q:#特殊情况
            return p
        elif q.left==p or q.right==p:#特殊情况
            return q
        elif q.val==root.val or p.val==root.val:
            return root
        else:
            if p.val<root.val<q.val or q.val<root.val<p.val :
                return root
            elif root.val>q.val or root.val>p.val :
                return self.lowestCommonAncestor(root.left,p,q)
            elif root.val<p.val or root.val<q.val:
                return self.lowestCommonAncestor(root.right,p,q)
            else:
                pass

c40354966b1346abbf732e5394409c47.png

相关文章
|
5天前
leecode刷题 二叉树 中序遍历
给定二叉树根节点,返回其节点值的中序遍历。示例1:输入root=[1,null,2,3],输出[1,3,2];示例2:输入root=[],输出[];示例3:输入root=[1],输出[1]。节点数范围[0,100],值范围[-100,100]。代码实现使用递归方法完成中序遍历。
|
5天前
leecode 刷题 二叉树的最大深度
给定二叉树根节点 `root`,返回其最大深度。最大深度是从根节点到最远叶子节点的最长路径上的节点数。例如,对于输入 `[3,9,20,null,null,15,7]`,输出为 `3`;对于输入 `[1,null,2]`,输出为 `2`。节点数量在 `[0, 104]` 范围内,值在 `[-100, 100]` 之间。
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
leetcode 之浅谈 N 叉树
之前去看 vue-router 源码的时候发现了 N 叉树的经典遍历框架,在源码中找到数据结构之类的算法,其实不算是很简单(对我来说)因为源码本身是嵌套嵌套再嵌套,无限套娃,有很多技术细节容
leetcode236—二叉树的最近公共祖先(递归/深搜/理解)
leetcode236—二叉树的最近公共祖先(递归/深搜/理解)
LeetCode每日一题(15)——两棵二叉搜索树中的所有元素
两棵二叉搜索树中的所有元素 1.题目 2.示例 3.思路 4.代码
LeetCode每日一题(15)——两棵二叉搜索树中的所有元素
每日一题——两棵二叉搜索树中的所有元素
每日一题——两棵二叉搜索树中的所有元素
73 0
每日一题——两棵二叉搜索树中的所有元素
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
代码随想录刷题|LeetCode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
LeetCode每日一题——1305. 两棵二叉搜索树中的所有元素
给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。
78 0
LeetCode每日一题——1305. 两棵二叉搜索树中的所有元素