📌  相关文章
📜  计算从节点到由相同值节点组成的叶子的对角路径(1)

📅  最后修改于: 2023-12-03 15:41:37.646000             🧑  作者: Mango

计算从节点到由相同值节点组成的叶子的对角路径

在二叉树中,一条从根节点到叶子节点的路径被称为一条叶子路径。现在给定一个二叉树,我们要计算从节点到由相同值节点组成的叶子的对角路径数量。

具体来说,如果一条路径满足以下条件: 1. 路径上所有节点的值相同; 2. 路径的起点为一个非叶子节点; 3. 路径的终点为一个叶子节点;

则该路径为一条对角路径。现在,你需要编写一个函数来计算一棵给定二叉树中对角路径的数量。

思路

首先,判断当前根节点是否为空或者是叶子节点,如果是,返回0。

然后递归遍历左右子树, 分别计算从左右子树根节点到叶子节点的对角路径数量。

如果当前根节点的左右子树根节点值相同,那么经过当前根节点的对角路径数量就是左右子树根节点到叶子节点的对角路径数量之和。

最后,如果当前根节点的值与左右子树根节点的值都相同,那么就需要加上经过当前根节点的对角路径数量。

代码实现
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class Solution:
    def count(self, root: TreeNode) -> int:
        if not root or (not root.left and not root.right):
            return 0
        res = 0
        if root.left and root.left.val == root.val:
            res += self.count(root.left.left) + self.count(root.left.right)
        if root.right and root.right.val == root.val:
            res += self.count(root.right.left) + self.count(root.right.right)
        if root.left and root.right and root.left.val == root.val and root.right.val == root.val:
            res += 1
        return res
测试

下面给出了对上述代码的测试程序:

node1 = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(2)
node4 = TreeNode(3)
node5 = TreeNode(3)
node6 = TreeNode(4)
node7 = TreeNode(4)

node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node4.left = node6
node4.right = node7

print(Solution().count(node1))  # 输出 2

运行结果为2,即二叉树中有两条对角路径。