.Net Core微服务——自动扩展、服务调用:Consul(二)

Spring中常用的SpEl表达式

  返回  

力扣--235.二叉搜索树的最近公共祖先(递归和迭代法)

2021/7/21 12:22:43 浏览:

题目

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

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

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

示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8        输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4         输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
说明:所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉搜索树中。

解题思路

本题和上题剑指offer68-II.二叉树的最近公共祖先不同,二叉树这道题目采用回溯从下往上进行搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近共同祖先,但是二叉搜索树是有序的。

那么在有序树里,如何来判断一个节点的左子树里有p,右子树里有q呢?其实只要从上到下遍历的时候,cur节点是数值在[p,q]区间中则说明该节点cur就是最近公共祖先了。

可以采用前序遍历(其实这里并无中节点的处理逻辑,所以遍历顺序都可)

假设:p为节点3,q为节点5

 从图中可以看出按照指定的方向,就可以找到节点4为最近公共祖先,而不需要遍历整棵树,找到结果直接返回。

(1)首先是递归法

递归三部曲:

  • 确定递归函数返回值以及参数:参数就是当前节点,以及两个节点p,q。返回值是要返回最近公共祖先。
  • 确定终止条件:无。因为题目已给出p,q为不同节点且均存在于给定的二叉搜索树中,也就是说一定会找到公共祖先的。
  • 确定单层递归的逻辑:在遍历二叉搜索树的时候就是寻找区间[p.val,q.val]。那么:1)如果cur.val大于p.val,同时cur.val大于q.val,就应该向左遍历(说明目标区间在左子树上);2)如果cur.val小于于p.val,同时cur.val小于q.val,就应该向右遍历(说明目标区间在右子树上);3)cur节点在区间p->val <= cur->val && cur->val <= q->val)或者 (q->val <= cur->val && cur->val <= p->val)中,那么cur就是最近公共祖先了,直接返回cur。
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        def transver(cur,p,q):
            if not root:return root
            if cur.val>p.val and cur.val>q.val:
                left=transver(cur.left,p,q)
                if left!=None:
                    return left
            elif cur.val<p.val and cur.val<q.val:
                right=transver(cur.right,p,q)
                if right!=None:
                    return right
            else:return cur

        return transver(root,p,q)

(2)迭代法

二叉搜索树的迭代法比递归更容易理解,因为其有序性(自带方向性),按照目标区间即可。

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

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号