NC5 二叉树根节点到叶子节点的所有路径和
Posted coder 靓仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NC5 二叉树根节点到叶子节点的所有路径和相关的知识,希望对你有一定的参考价值。
情景提要
牛客题解系列,按照题号顺序开始。
NC5 二叉树根节点到叶子节点的所有路径和
01
02
输入输出示例
输入:
{1,0}
输出:
10
03
题目分析
对于二叉树的题目,一般来说,都有迭代和递归两种方法可以解决。
需要思考对二叉树的遍历方式。如本题,从根节点开始,依次向下遍历即可。也就是 中左右 或者 中右左。
按照习惯,采样前序遍历。
思路1
采用递归进行遍历。
需要考虑递归函数何时返回?传递到参数有哪些?
访问到叶子结点就返回啦。至于传递参数,在写的过程中,就慢慢补上了。
这里有两种方法,一种是定义一个中间变量,利用回溯,来记录到当前结点的数字,另一种是将数字直接存在当前结点的数值上。本篇就先采用第二种啦。
思路2
本题中,可以使用队列进行层序遍历,较简单些。当然,采用栈来模拟也能写出来,小伙伴们可以自己去尝试下哦。
03
代码实现
方法1
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int res = 0;
int sumNumbers(TreeNode* root) {
// write code here
if(!root) return 0;
travel(root, 0);
return res;
}
void travel(TreeNode* node,int sum){
node->val += sum * 10;
if(node->left) {
travel(node->left, node->val);
}
if(node->right) {
travel(node->right, node->val);
}else if(!node->left){
res += node->val;
}
}
};
方法2
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
//用队列模拟
int sumNumbers(TreeNode* root) {
// write code here
int res = 0;
queue<TreeNode*> q;
if(root) q.push(root);
TreeNode* node;
while(!q.empty()){
int n=q.size();
for(int i=0;i<n;++i){
node = q.front();
q.pop();
if(node->left){
node->left->val += node->val*10;
q.push(node->left);
}
if(node->right){
node->right->val += node->val*10;
q.push(node->right);
}else if(!node->left){
res += node->val;
}
}
}
return res;
}
};
04
总结
二叉树问题,思考遍历方式。
欢迎评论区留言哦
以上是关于NC5 二叉树根节点到叶子节点的所有路径和的主要内容,如果未能解决你的问题,请参考以下文章
[javascript]二叉树根节点到叶子节点和为指定值的路径