二叉树的所有路径和——中等难度
Posted 我是一颗大萝北
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的所有路径和——中等难度相关的知识,希望对你有一定的参考价值。
一、题目描述
二、问题分析
要找从根节点到叶子结点的路径,必须得是先序遍历
(1)首先想到用一个全局变量sum去记录每一条路径的累加和
(2)叶子结点肯定是递归的一个出口
(3)别忘了root==nullpt也是递归的出口,并且要放在函数的第一行
三、初版代码
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int sum=0;
int sumNumbers(TreeNode* root) {
// write code here
if(root==nullptr) return 0; //空树,直接返回0
temp(root,0);
return sum;
}
void temp(TreeNode* root, int num){
if(root->right==nullptr&&root->left==nullptr) //叶子结点
{
sum=sum+(num*10+root->val);
return;
}
if(root==nullptr) //空节点
return;
/*---如果既不是叶子结点,也不是空节点,进行先序遍历----*/
num=num*10+root->val; //根
temp(root->left, num); //左
temp(root->right,num); //右
}
};
报错:
原因居然是这样的。。。
对结点是否为空的判断一定要放在最前面!也就是这个if语句一定要放在递归函数的最前面。否则会出现nullptr->right和nullptr->left这种溢出错误。
if(root==nullptr) //空节点
return;
或者,直接这样
if(root->right==nullptr&&root->left==nullptr) //叶子结点 或 只有一个根节点的树
{
sum=sum+(num*10+root->val);
return;
}
//if(root==nullptr) //空节点
// return;
/*---如果既不是叶子结点,也不是空节点----*/
num=num*10+root->val;
if(root->left!=nullptr) temp(root->left, num);
if(root->right!=nullptr) temp(root->right,num);
四、给出最终代码
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int sum=0;
int sumNumbers(TreeNode* root) {
// write code here
if(root==nullptr) return 0; //空树,直接返回0
temp(root,0);
return sum;
}
void temp(TreeNode* root, int num){
if(root==nullptr) //空节点
return;
if(root->right==nullptr&&root->left==nullptr) //叶子结点
{
sum=sum+(num*10+root->val);
return;
}
/*---如果既不是叶子结点,也不是空节点----*/
num=num*10+root->val;
temp(root->left, num);
temp(root->right,num);
}
};
或者
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int sum=0;
int sumNumbers(TreeNode* root) {
// write code here
if(root==nullptr) return 0; //空树,直接返回0
temp(root,0);
return sum;
}
void temp(TreeNode* root, int num){
if(root->right==nullptr&&root->left==nullptr) //叶子结点
{
sum=sum+(num*10+root->val);
return;
}
//if(root==nullptr) //空节点
// return;
/*---如果既不是叶子结点,也不是空节点----*/
num=num*10+root->val;
if(root->left!=nullptr) temp(root->left, num);
if(root->right!=nullptr) temp(root->right,num);
}
};
以上是关于二叉树的所有路径和——中等难度的主要内容,如果未能解决你的问题,请参考以下文章
实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)
c_cpp 236.二叉树的最低共同祖先 - 难度中等 - 2018.9.13
一天一大 lee完全二叉树的节点个数 (难度:中等) - Day20201124