Day18-二叉树-路径之和
时间:2022-06-25
本文章向大家介绍Day18-二叉树-路径之和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一 唠嗑
我又拖更了,我出来挨打
因为最近校招快开始了,为了帮助更多的同学,我进度拉快一点,递归回溯问题,到N皇后,已经比较难了,当然我这还有难题,以后慢慢更,这个程度已经可以了
本来递归&回溯之后,我想更贪心算法的,但是我看了看贪心的题都比较简单,想了想还是先把重要的二叉树和图在前面先讲完,再更比较简单的贪心,毕竟有参加提前批的同学嘛~
什么,你问我这周会不会还拖更?
二 上题!
建议大家复习一下二叉树的基础知识,比如常见的三种遍历,前,中,后序遍历(递归),以及层次遍历(利用队列),我就不多赘述了~
Q:给定一个二叉树和整数sum,返回所有,根节点到叶节点的路径中,和为sum的路径。
举例:网上找的图,给定sum = 22
则需要返回 [[5, 4, 11, 2], [5, 8, 4, 5]]
三 冷静分析
首先我们要知道,二叉树的题,我们首先要想到用递归&回溯的思想,如果不行,或者不允许使用,再想其他的方法~
其次二叉树的遍历过程中,存储节点,或者节点的值,和栈&队列又有千丝万缕的联系,结合使用,就是二叉树算法的精髓了。
我们可以这样处理逻辑:
1.从根节点,深搜二叉树,将节点值存储在路径栈path中;
2.遍历到叶子节点时,判断当前路径和是否为sum,若是,将该路径,添加进二维数组result中;
3.出每层的递归后,将该节点从路径栈中弹出,并将路径和pathValue减去该节点的值,来实现向上回溯。
四 完整代码及注释
//
// Created by renyi on 2019-07-03.
//
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode{//二叉树的每个节点的数据结构
int value;
TreeNode* left;
TreeNode* right;
TreeNode(int v) : value(v), left(NULL), right(NULL) {}
};
void preOrder(TreeNode* root, int &pathValue, int sum, vector<int> &path, vector<vector<int>> &result){
if (!root){
return;
}
pathValue += root->value;//遍历一个节点就更新一下路径值
path.push_back(root->value);//将节点值push进路径栈path
if (!root->left && !root->right && pathValue == sum){
result.push_back(path);
}
preOrder(root->left, pathValue, sum, path, result);
preOrder(root->right, pathValue, sum, path, result);
pathValue -= root->value;//这里出递归,向上回溯,所以减去节点值
path.pop_back();//并将当前节点弹出路径栈path
}
vector<vector<int>> pathSum(TreeNode* root, int sum){
vector<vector<int>> result;//初始化二维数组result,存储最后结果
vector<int> path;//路径栈path
int pathValue = 0;
preOrder(root, pathValue, sum, path, result);
return result;
}
int main(){
TreeNode a(5);//建立配图的二叉树
TreeNode b(4);
TreeNode c(8);
TreeNode d(11);
TreeNode e(13);
TreeNode f(4);
TreeNode g(7);
TreeNode h(2);
TreeNode i(5);
TreeNode j(1);
a.left = &b;
a.right = &c;
b.left = &d;
c.left = &e;
c.right = &f;
d.left = &g;
d.right = &h;
f.left = &i;
f.right = &j;
vector<vector<int>> result = pathSum(&a, 22);
for (int m = 0; m < result.size(); m++) {
for (int n = 0; n < result[m].size(); n++) {
printf("[%d]", result[m][n]);
}
printf("n");
}
return 0;
}
运行结果
- windows API 开发飞机订票系统 图形化界面 (三)
- windows API 开发飞机订票系统 图形化界面 (二)
- SQL SERVER几种数据迁移/导出导入的实践
- dom4j 使用总结
- 快速对表的某字段赋递增的数值
- SQL SERVER修改函数名引起的问题
- SQL Server安全(1/11):SQL Server安全概述
- SQL Server安全(2/11):身份验证(Authentication)
- SQL Server安全(3/11):主体和安全对象(Principals and Securables)
- 在SQL Server里如何进行页级别的恢复
- 你可能不知道的字符比较中的“秘密”
- c++实现简单计算器
- re模块(正则表达式)
- Python学习——collections系列
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!
- 如何快速分析大型系统架构?
- Linux小技巧、文件查找、修改、读取
- 我在赏金计划中发现的RACE条件漏洞
- 哦!数组还能这么用,学到了!
- 【C++简明教程】随机数生成
- Pytest标记预期失败得测试用例@pytest.mark.xfail()
- IAT HOOK
- 形式化分析工具(六):HLPSL Tutorial
- 推荐一款技术人必备的接口测试神器:Apifox
- GO 文档笔记
- 魔改npm私有仓库 | Verdaccio教程
- 【Vulnhub】AI Web 2.0
- Python迭代器和生成器
- Python深层解析json数据之JsonPath