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

相关文章
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
|
10月前
|
算法
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
leetcode236—二叉树的最近公共祖先(递归/深搜/理解)
leetcode236—二叉树的最近公共祖先(递归/深搜/理解)
LeetCode每日一题(15)——两棵二叉搜索树中的所有元素
两棵二叉搜索树中的所有元素 1.题目 2.示例 3.思路 4.代码
LeetCode每日一题(15)——两棵二叉搜索树中的所有元素
LeetCode每日一题——1305. 两棵二叉搜索树中的所有元素
给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。
73 0
LeetCode每日一题——1305. 两棵二叉搜索树中的所有元素
LeetCode 96不同的二叉搜索树&95不同的二叉搜索树Ⅱ
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
125 0
LeetCode 96不同的二叉搜索树&95不同的二叉搜索树Ⅱ
Leecode_BTS二叉搜索树寻找最近祖先 题解
Leecode_BTS二叉搜索树寻找最近祖先 题解
93 0
Leecode_BTS二叉搜索树寻找最近祖先 题解
|
算法
LeetCode题解—二叉树
今天说说二叉树。
163 0
LeetCode题解—二叉树
|
算法 前端开发 程序员
「LeetCode」236-二叉树的最近公共祖先⚡️
「LeetCode」236-二叉树的最近公共祖先⚡️
116 0
「LeetCode」236-二叉树的最近公共祖先⚡️
|
算法 前端开发 程序员
「LeetCode」剑指Offer-33二叉搜索树的后序遍历序列 ⚡️
「LeetCode」剑指Offer-33二叉搜索树的后序遍历序列 ⚡️
118 0
「LeetCode」剑指Offer-33二叉搜索树的后序遍历序列 ⚡️