• 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

  • 相关阅读:
    【高并发基础】理解 MVCC 及提炼实现思想
    身份证实名认证API接口,选择的时候应该注意什么?
    计算机竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR
    【计算机网络篇】计算机网络的性能指标
    OpenCV(八)——基本线条操作
    密码学入门
    保护自己免受黑客和诈骗者侵害的最佳方法
    我们下一代的 Linux 容器工具:Podman
    Spark集群中一个Worker节点启动失败的排错记录
    【一起学数据结构与算法】时间复杂度_空间复杂度
  • 原文地址:https://blog.csdn.net/Michelle209/article/details/133986692