题目描述是:
给你一个二叉树的根节点 root
,树中每个节点都存放有一个 0
到 9
之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径
1 -> 2 -> 3
表示数字123
。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
一下是题目示例:
由题意分析可知,其主要考察的是二叉树的中序遍历,也即根左右。因为题目规定,每一层的二叉树节点的数量级是不同的,随着层数的增加,第一次的数量级大小也随之增加。同时也要计算每一个路径的数字之和。
只有中序遍历可以独立的遍历二叉树的每一个路径,才能顺利的得出每一个路径的数字之和。
当然其中还有一个要点,就是需要保存好路径的数字和。
下面是c++的完整解法:
#include <iostream>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
}
int sumNumbers(TreeNode *root){
return def(root, 0);
}
int dfs(TreeNode *root, int sum){
if(root == nullptr){
return 0;
}
//计算当前路径的数字之和
int newSum = sum * 10 + root->val;
//如果是叶子节点,则返回当前路径的数字之和
if(root->left == nullptr && root->right == nullptr){
return newSum;
}
//递归计算左子树和右子树的数字之和,并且累加到当前路径
int leftSum = dfs(root->left, newSum);
int rightSum = dfs(root->right, newSum);
return leftSum + rightSum;
}
然后是go语言的解法。两种语言的思路一致。
package main
import "fmt"
type Treenode struct {
Val int
Left *Treenode
Right *Treenode
}
func sumNumbers(root *Treenode) int {
return dfs(root, 0)
}
func dfs(root *Treenode, sum int) int {
if root == nil {
return 0
}
//计算当前路径的数字之和
newSum := sum*10 + root.Val
//如果当前节点是叶子节点,则返回当前路径的数字之和
if root.Left == nil && root.Right == nil {
return newSum
}
//递归计算左子树和右子树的数字之和,并累加到当前路径的数字之和
LeftSum := dfs(root.Left, newSum)
RightSum := dfs(root.Right, newSum)
return LeftSum + RightSum
}