• leetcode236 Lowest Common Ancestor of a Binary Tree


     1 """
     2 Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
     3 According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
     4 Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4]
     5 Example 1:
     6 Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
     7 Output: 3
     8 Explanation: The LCA of nodes 5 and 1 is 3.
     9 Example 2:
    10 Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    11 Output: 5
    12 Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
    13 """
    14 """
    15 本题两种解法。第一种非递归的方法
    16 用queue来存储结点遍历
    17 用dict{root, parent[root]}来存储每个结点的父亲结点
    18 然后用一个set存储p的所有父辈结点
    19 再遍历q的每个父亲结点查找是否再set中
    20 如果找到即为p,q结点的最近公共祖先
    21 """
    22 class TreeNode:
    23     def __init__(self, x):
    24         self.val = x
    25         self.left = None
    26         self.right = None
    27 
    28 class Solution1:
    29     def lowestCommonAncestor(self, root, p, q):
    30         queue = [root]       #用来层次遍历
    31         parent = {root: None} #用dict存储父亲结点
    32         while queue:
    33             node = queue.pop()
    34             if node.left:
    35                 parent[node.left] = node  #存父亲结点
    36                 queue.append(node.left)   #入队
    37             if node.right:
    38                 parent[node.right] = node
    39                 queue.append(node.right)
    40         res = set() #set集合是一个无序不重复元素的序列
    41         while p:    #res=() 这是把res定义为tuple,tuple是只能查看的list
    42             res.add(p)    #将p的所有父辈结点放入set里
    43             p = parent[p]
    44         while q not in res: #q向上找到相同的父亲结点
    45             q = parent[q]
    46         return q
    47 
    48 """
    49 第二种是递归写法:没有理解
    50 传送门:https://blog.csdn.net/qq_17550379/article/details/95903394
    51 树型问题首先考虑递归,对于每个树中的p和q只会有一下几种情况
    52 1. p在左子树中,q在右子树中
    53 2. q在左子树中,p在右子树中
    54 3. p和q都在左子树中
    55 4. p和q都在右子树中
    56 对于第一种和第二种情况很简单,p和q的最近公共祖先就是root。
    57 对于第三种情况我们只需递归向左子树找,第四种情况我们只需递归向右子树找。接着思考边界情况。
    58 当p==root or q==root的时候,我们返回root即可(因为要找最近公共祖先,继续遍历的话,就不可能是其祖先了)。
    59 那么这里就有一个迷惑人的地方了,请认真思考第一种和第二种情况下,左右子树的递归返回结果是什么?就是p和q。
    60 """
    61 
    62 class Solution2:
    63     def lowestCommonAncestor(self, root, p, q):
    64         if not root or root == p or root == q:
    65             return root
    66         left = self.lowestCommonAncestor(root.left, p, q)
    67         right = self.lowestCommonAncestor(root.right, p, q)
    68         if left and right:
    69             return root
    70         return left if left else right
  • 相关阅读:
    四则运算3
    结对编程
    2016年秋季-软件需求分析-UML图
    2016年秋季-学习进度条
    2016年秋季-学习进度条
    2016年秋季-《UML大战需求分析》-阅读笔记1
    2016年秋季-课堂练习1-Liz开发问题账户分析系统
    2016年秋季-《UML大战需求分析》-个人阅读计划
    2016年秋季-软件需求与分析-基本知识
    用户体验
  • 原文地址:https://www.cnblogs.com/yawenw/p/12305537.html
Copyright © 2020-2023  润新知