• 树-祖先节点问题


     二叉树的堂兄弟节点
    在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
    如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。
    我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。
    只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。
    输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
    输出:true
    class Solution(object):
        def isCousins(self, root, x, y):
            parent = {}
            depth = {}
            def dfs(node, par = None):
                if node:
                    depth[node.val] = 1 + depth[par.val] if par else 0
                    parent[node.val] = par
                    dfs(node.left, node)
                    dfs(node.right, node)
    
            dfs(root)
            return depth[x] == depth[y] and parent[x] != parent[y]
    View Code
    link:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof
    describe:
    给定一个二叉搜索树【值是有规律的】, 找到该树中两个指定节点的最近公共祖先。
    
    百度百科中最近公共祖先的定义为:“对于有根树 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 为不同节点且均存在于给定的二叉搜索树中。
    class Solution:
        def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
            if not root:
                return 
            if root.val > p.val and root.val >q.val:
                return self.lowestCommonAncestor(root.left,p,q)
            if root.val < p.val and root.val < q.val:
                return self.lowestCommonAncestor(root.right,p,q)
            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':
            if p.val > q.val:p,q=q,p
            while root:
                if p.val > root.val and q.val>root.val:
                    root = root.right
                elif p.val < root.val and q.val < root.val:
                    root = root.left
                else:
                    break
            return root
    View Code
    link:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
    
    describe:
    给定一个二叉树【值是无规律的】, 找到该树中两个指定节点的最近公共祖先。
    
    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
    class Solution:
        def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
            if not root or root.val == p.val or root.val == q.val: return root
            l = self.lowestCommonAncestor(root.left,  p , q)
            r = self.lowestCommonAncestor(root.right,  p , q)
            return root if l and r else l or r
    好好学习,天天向上
  • 相关阅读:
    逻辑回归(logistics regression) 总结
    SQL注入原理
    xss绕过过滤之方法
    PHP CALC
    IP欺骗原理与过程分析
    DNS域传送漏洞利用
    linux性能测试工具perf
    linux设置程序开机自启
    Http请求中Content-Type和Accept讲解以及在Spring MVC中的应用
    random函数的使用
  • 原文地址:https://www.cnblogs.com/topass123/p/13369919.html
Copyright © 2020-2023  润新知