二叉树的堂兄弟节点 在二叉树中,根节点位于深度 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]
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
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