LeetCode 257. 二叉树的所有路径 思考分析

目录

    • 题目
    • 思路一:深度递归
    • 思路二:广度迭代
    • 关于回溯

题目

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

输入:

在这里插入图片描述

输出: [“1->2->5”, “1->3”]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

思路一:深度递归

void traversal(TreeNode* cur , vector<string>& paths,string path){if(cur == NULL) return;path+=to_string(cur->val);//如果是叶子结点,返回将path送入paths,然后return回去if(!cur->left && !cur->right){paths.push_back(path);}//如果不是叶子结点,将该结点加入路径,然后继续遍历左右子结点else{path+= "->";traversal(cur->left,paths,path);traversal(cur->right,paths,path);}return;}

之前我一直在思考一个问题,就是如果我已经完成了一条路径,那么必定要向上回溯到上面的结点,那么此时的path又该是怎样的呢?
在我一开始的认为中,path会直接在原有的已完成的一条路径上再次添加->,但仔细一想,并不是这样。
以下面的树为例:

1
/ \
2 3
\
5

遍历的结点输入前的path输入后的pathpaths
11->
21->1->2->
2的左孩子NULL1->2->1->2->
51->2->1->2->51->2->5
2(return的时候,返回到原来的函数,参数仍然是原来函数的参数)1->1->21->2->5
1(return的时候,返回到原来的函数,参数仍然是原来函数的参数)1->1->2->5
31->1->31->2->5,1->3
1(return的时候,返回到原来的函数,参数仍然是原来函数的参数)1->1->2->5,1->3

最后return根结点。

返回到上一级的时候path会被重置为上一级函数的path,而vector中的值不会被修改,因为我们使用的是&,vector中的值已经被修改了。

AC代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:void traversal(TreeNode* cur , vector<string>& paths,string path){if(cur == NULL) return;path+=to_string(cur->val);//如果是叶子结点,返回将path送入paths,然后就该if(!cur->left && !cur->right){paths.push_back(path);}//如果不是叶子结点,将该结点加入路径,然后继续遍历左右子结点else{path+= "->";traversal(cur->left,paths,path);traversal(cur->right,paths,path);}return;}vector<string> binaryTreePaths(TreeNode* root) {vector<string> paths;string path ="";traversal(root,paths,path);return paths;}
};

在这里插入图片描述
感觉对于回溯的思想还是很陌生,等二叉树的题目练完了就去找几个回溯的练练手。
递归就是函数的嵌套调用,函数调用的时候会将参数存入栈中,所以返回到上一级函数时,参数会自动拨正。

思路二:广度迭代

维护一个队列,存储结点以及根到该结点的路径。
一开始这个队列里面只有根结点。
每一步迭代中,我们取出队列中的首结点,如果它是叶子结点,则将它对应的路径加入到答案中。
如果它不是叶子结点,则将它的所有孩子结点加入到队列的末尾。当队列为空时广度优先搜索结束。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> paths;if(root == NULL){return paths;}queue<TreeNode*> node_queue;queue<string> path_queue;node_queue.push(root);path_queue.push(to_string(root->val));while(!node_queue.empty()){TreeNode* node = node_queue.front();string path = path_queue.front();node_queue.pop();path_queue.pop();if(node->left == NULL && node->right == NULL){paths.push_back(path);}else{if(node->left !=NULL){node_queue.push(node->left);path_queue.push(path+"->"+to_string(node->left->val));}if(node->right !=NULL){node_queue.push(node->right);path_queue.push(path+"->"+to_string(node->right->val));}}}return paths;}
};

关于回溯

class Solution {
public:void traversal(TreeNode* cur,vector<int>& path,vector<string>& paths){path.push_back(cur->val);//如果是叶子结点if(cur->left == NULL && cur->right ==NULL){string spath;for(int i=0;i<path.size()-1;i++){spath+= to_string(path[i]);spath+="->";}spath+=to_string(path[path.size()-1]);paths.push_back(spath);}//不是叶子结点if(cur->left){traversal(cur->left,path,paths);path.pop_back();//回溯}if(cur->right){traversal(cur->right,path,paths);path.pop_back();//回溯}}vector<string> binaryTreePaths(TreeNode* root) {vector<string> paths;vector<int> path;if(root == NULL) return paths;traversal(root,path,paths);return paths;}
};

注意这里对子路径path使用了&,所以一旦改变之后,就无法返回到上一个函数的参数了,所以需要进行pop_back进行回溯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十四、Canny边缘提取

一、算法步骤 1&#xff0c;对图像进行GaussianBlur(高斯模糊)消除一些噪声 2&#xff0c;对图像进行灰度转换cvtColor 3&#xff0c;计算梯度Sobel/Scharr 4&#xff0c;非最大信号抑制 5&#xff0c;高低阈值输出二值图像 设定两个阈值T1和T2&#xff0c;凡是高于T2的都保…

图解PCB布线数字地、模拟地、电源地,单点接地抗干扰!

我们在进行pcb布线时总会面临一块板上有两种、三种地的情况&#xff0c;傻瓜式的做法当然是不管三七二十一&#xff0c;只要是地 就整块敷铜了。这种对于低速板或者对干扰不敏感的板子来讲还是没问题的&#xff0c;否则可能导致板子就没法正常工作了。当然若碰到一块板子上有多…

十五、霍夫直线检测

一、自定义 import cv2 import numpy as np from matplotlib import pyplot as pltdef line_detection(image):gray cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)edges cv2.Canny(gray,50,150,apertureSize3)lines cv2.HoughLines(edges,1,np.pi/180,200)for line in lines:rho…

【C++ grammar】对象指针、对象数组、函数参数

目录1、Object Pointer & Dynamic Object1. Accessing Object Members via Pointers2. Creating Dynamic Objects on Heap2、Array of Objects声明方式3、Passing Objects to Functions1、Objects as Function Arguments (对象作为函数参数)2. Objects as Function Return …

十六、霍夫圆形检测

一、获取圆形检测原理 原图如下&#xff1a; 选取一个圆的任意点设定为圆形进行绘制圆形&#xff0c;交与一点 再将平面直角坐标系上的各点&#xff0c;通过公式转到极坐标上 很明显的看出较亮的点为圆心&#xff0c;然后通过半径进行绘制出圆。 二、实现步骤 由于霍夫圆检…

商务智能与交易系统的区别

商务智能与交易系统的区别 1、系统设计的区别 商务智能与交易系统之间的差异主要体现在系统设计和数据类型上&#xff08;见表 1.1 和表1.2&#xff09;。交易系统把结构强加于商务之上&#xff0c;不管谁来进行一项交易活动&#xff0c; 都会遵循同样的程序和规则&#xff0c;…

LeetCode 572. 另一个树的子树 思考分析

题目 给定两个非空二叉树 s 和 t&#xff0c;检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 1: 给定的树 s: 示例 2: 给定的树 s: 思路 思路&#xff1a;首先层序遍历s树…

十七、轮廓发现

一、轮廓发现原理 轮廓发现是在图像边缘提取的基础上寻找对象轮廓的方法&#xff0c;故边缘提取的阈值的选定会影响到最终轮廓发现的结果。 其本质是基于二值图像的&#xff0c;边缘提取常用Canny进行提取边缘 轮廓发现也是基于拓扑结构&#xff0c;扫描连通图&#xff0c;最后…

关于 WebRequest.RegisterPrefix

RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议&#xff08;例如 HTTP 或 FTP&#xff09;&#xff0c;但也可能被注册来处理对特定服务器或服务器上的路径的请求。 已注册的预注册保留类型包括下列类型&#xff1a; htt…

LeetCode 404. 左叶子之和思考分析

题目 计算给定二叉树的所有左叶子之和。 如果是下面的树&#xff0c;只有一个左叶子结点4 思考分析 由此我们可以得到左叶子结点的定义&#xff1a; cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 递归遍历累积操作 …

十八、对已经找到轮廓的图像进行测量

图像轮廓的获取可参考博文十七 一、相关原理 1&#xff0c;弧长和面积 对于弧长和面积&#xff0c;计算出来的轮廓单位都是像素 2&#xff0c;多边形拟合 每一个轮廓都是一系列的点&#xff0c;然后通过多边形进行拟合&#xff0c;无限的接近真实形状 相关API&#xff1a;…

Linux 终端登录SSH:解决SSH的Access Denied 和 make xconfig的使用

对于SSH&#xff1a; 可以不是用putty&#xff0c;尤其是putty出现 Access denied 的时候&#xff0c;请换用konsole 或者其他终端 &#xff08;如 terminal&#xff09;在command line中&#xff1a; # ssh 要访问的主机ip eg &#xff1a; ssh 192.168.111 然后确定…

LeetCode 513. 找树左下角的值 思考分析

题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件&#xff1a; 1、深度最大的叶子结点 2、最左结点&#xff1a;使用前序遍历&#xff0c;优先左边搜索。 1、确定递归函数的参数和返回值 参数&#xff1a;树的根结点&#xff…

Linux 平台下 MySQL 5.5 安装 说明 与 示例

一.下载说明前期的一些准备说明&#xff0c;参考&#xff1a;MySQL 发展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 说明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分为Community Server 和 Enterprise Edition。…

LeetCode 112. 路径总和 、113. 路径总和 II 思考分析

目录112. 路径总和题目递归解递归解&#xff0c;其他人的解法迭代解&#xff0c;其他人的解法113. 路径总和 II题目递归解递归解&#xff0c;参考别人的思路112. 路径总和 题目 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;…

【C++ grammar】抽象、封装与this指针

目录1、Abstraction and Encapsulation&#xff08;抽象与封装&#xff09;1. Data Field Encapsulation (数据域封装)2. Accessor and Mutator (访问器与更改器)2.1. To read/write private data, we need get/set function (为读写私有数据&#xff0c;需要get/set函数)2.2. …

十九、图像的形态学操作

一、图像形态学 图像形态学是图像处理学科的一个单独分支学科 主要针对的是灰度图和二值图像 是由数学的集合论以及数学中的拓扑几何原理发展而来 二、膨胀操作&#xff08;dilate&#xff09; 33的卷积核 以33为卷积核从左往右(从上往下)开始运行&#xff0c;若这卷积核…

X名称空间(WPF)

笔记简述 闲话x名称空间简要x名称空间的Attributex名称空间的标签扩展x名称空间的XAML指令元素闲话 本笔记参考与《深入浅出WPF》、MSDN、Some Blog… MSDN的飞机票点这里。 x名称空间简要 在VS中新建个WpfApplication都会自动生成xmlns:x"http://schemas.microsoft.com/w…

leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析

目录1、106题目2、参考思路&#xff1a;递归切割数组3、105题目4、同样思路的代码1、106题目 2、参考思路&#xff1a;递归切割数组 代码参考&#xff1a;公众号&#xff1a;代码随想录 后序数组中序数组 以 后序数组(左右中)的最后一个元素作为切割点&#xff0c;先切中序数组…

二十、分水岭算法

一、基本原理 分水岭算法主要是基于距离变换&#xff08;distance transform&#xff09;&#xff0c;找到mark一些种子点&#xff0c;从这些种子点出发根据像素梯度变化进行寻找边缘并标记 分水岭&#xff1a;可以简单的理解成一座山&#xff0c;然后来洪水了&#xff0c;水开…