首页 > 试题广场 >

二叉树根节点到叶子节点的所有路径和

[编程题]二叉树根节点到叶子节点的所有路径和
  • 热度指数:78312 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉树的根节点root,该树的节点值都在数字 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n

例如根节点到叶子节点的一条路径是,那么这条路径就用 来代替。
找出根节点到叶子节点的所有路径表示的数字之和
例如:

这颗二叉树一共有两条路径,
根节点到叶子节点的路径 用数字 代替
根节点到叶子节点的路径 用数字 代替
所以答案为

数据范围:节点数 ,保证结果在32位整型范围内
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度 
示例1

输入

{1,2,3}

输出

25
示例2

输入

{1,0}

输出

10
示例3

输入

{1,2,0,3,4}

输出

257

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
推荐
先序遍历的思想(根左右)+数字求和(每一层都比上层和*10+当前根节点的值)

	public int sumNumbers(TreeNode root) {
		int sum = 0;
		if (root == null) {
			return sum;
		}
		return preorderSumNumbers(root, sum);
	}
	public int preorderSumNumbers(TreeNode root, int sum) {
		if (root == null)
			return 0;
		sum = sum * 10 + root.val;
		if (root.left == null && root.right == null) {
			return sum;
		}
		return preorderSumNumbers(root.left, sum) + preorderSumNumbers(root.right, sum);
	}

编辑于 2016-12-03 17:32:39 回复(19)
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

#
# 
# @param root TreeNode类 
# @return int整型
#
class Solution:
    def sumNumbers(self , root ):
        # write code here
        if not root:
            return 0
        res = []
        
        def dfs(root,temp):
            if not root:
                return 
            if not root.left and not root.right:
                temp += str(root.val)
                res.append(temp)
            dfs(root.left, temp+str(root.val))
            dfs(root.right, temp+str(root.val))
            return 
        
        dfs(root, "")
        sum_ = 0
        for i in res:
            sum_ += int(i)
        return sum_

根据路径和总结的经验
发表于 2021-06-26 10:20:06 回复(0)
s = ''
count = 0
class Solution:
    def get(self,root):
        global count , s
        if(root):
            s+=str(root.val)
            if not root.left and not root.right:
                count+=int(s)
                s = s[:-1]
            if root.left:    self.get(root.left)
            if root.right:    self.get(root.right)
    def sumNumbers(self , root ):
        # write code here
        if not root:    return 0
        self.get(root)
        return count
{0,1}   这组数据测试没问题,提交就出错。懵了????????????????
发表于 2020-12-26 22:52:45 回复(0)
都用的递归,来一个非递归后序遍历版本的:
class Solution:
    def sumNumbers(self , root ):
        ret = 0
        cur = 0
        last = None
        stack=[]
        while root or stack:
            if root:
                stack.append(root)
                cur = cur * 10 + root.val
                root = root.left
            else:
                root = stack[-1]
                root = root.right
                if root is None or root == last:
                    root = stack.pop(-1)
                    if not root.left and not root.right:
                        ret += cur
                    cur  = cur/10
                    last = root
                    root = None



编辑于 2020-09-18 14:17:47 回复(0)

问题信息

难度:
3条回答 33515浏览

热门推荐

通过挑战的用户