• Python算法练习 10.23


    leetcode 1372 二叉树中的最长交错路径

    给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:

    • 选择二叉树中 任意 节点和一个方向(左或者右)。
    • 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
    • 改变前进方向:左变右或者右变左。
    • 重复第二步和第三步,直到你在树中无法继续移动。

    交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。

    请你返回给定树中最长 交错路径 的长度。

    示例 1:

    输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
    输出:3
    解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
    

    示例 2:

    输入:root = [1,1,1,null,1,null,null,1,1,null,1]
    输出:4
    解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
    

    示例 3:

    输入:root = [1]
    输出:0

     常规的深搜题

    如果该结点是双亲的左子树,那遍历该结点左子树的时候从0计数,遍历该结点右子树的时候沿用上一层的ZigZag值;反之。

    1. # Definition for a binary tree node.
    2. # class TreeNode(object):
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution(object):
    8. def longestZigZag(self, root):
    9. """
    10. :type root: TreeNode
    11. :rtype: int
    12. """
    13. def nextLevel(root, lastDirection, maxZigZag):
    14. maxZigZag += 1
    15. leftZigZag = rightZigZag = maxZigZag
    16. if lastDirection == 'L':
    17. if root.right:
    18. rightZigZag = nextLevel(root.right, 'R', maxZigZag)
    19. if root.left:
    20. leftZigZag = nextLevel(root.left, 'L', 0)
    21. return max(leftZigZag, rightZigZag)
    22. if lastDirection == 'R':
    23. if root.left:
    24. leftZigZag = nextLevel(root.left, 'L', maxZigZag)
    25. if root.right:
    26. rightZigZag = nextLevel(root.right, 'R', 0)
    27. return max(leftZigZag, rightZigZag)
    28. if not root.left and not root.right:
    29. return 0
    30. maxZigZag = 0
    31. leftZigZag = rightZigZag = maxZigZag
    32. if root.left:
    33. leftZigZag = nextLevel(root.left, 'L', maxZigZag)
    34. if root.right:
    35. rightZigZag = nextLevel(root.right, 'R', maxZigZag)
    36. return max(leftZigZag, rightZigZag)

     leetcode 236 二叉树的最近公共祖先

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

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

     

    示例 1:

    输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    输出:3
    解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
    
    

    示例 2:

    输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    输出:5
    解释:节点 5 和节点 4 的最近公共祖先是节点 5 。
    因为根据定义最近公共祖先节点可以为节点本身。
    

    示例 3:

    输入:root = [1,2], p = 1, q = 2
    输出:1

    感觉把自己绕晕了...写了半天没写出来,直接看题解了:

     如果一个结点是p和q的公共祖先,p与q的分布则满足三种情况:

    1. p与q一个在左子树中,一个在右子树中
    2. p就是公共祖先,q在其左或右子树中
    3. q就是公共祖先,p在其左或右子树中

    通过递归对二叉树进行先序遍历,当遇到节点 p 或 q 时返回。从底至顶回溯,当节点 p,q 在节点 root的异侧时,节点 root即为最近公共祖先,则向上返回 root

    1. class Solution:
    2. def lowestCommonAncestor(self, root, p, q):
    3. if root in (None, p, q):
    4. return root
    5. left = self.lowestCommonAncestor(root.left, p, q)
    6. right = self.lowestCommonAncestor(root.right, p, q)
    7. if left and right:
    8. return root
    9. return left or right

  • 相关阅读:
    AI中英文翻译软件,一键批量多语种翻译
    后端八股笔记-----mysql
    音视频的Buffer处理
    SQL-方法论
    Docker-Cgroup
    Appium移动端自动测试框架,如何入门?
    Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值
    人工智能数学基础--概率与统计14:连续随机变量的指数分布、威布尔分布和均匀分布
    【计算机基础】CPU概述及CPU的内部结构
    《C和指针》笔记35:结构体
  • 原文地址:https://blog.csdn.net/Michelle209/article/details/133986692