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.pswp.cn/news/377996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377996.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自定義django的Template context processors

簡要步驟&#xff1a; 1.編輯一個函數: def media_url(request):from django.conf import settingsreturn {media_url: settings.MEDIA_URL}2.配置settings&#xff1a; TEMPLATE_CONTEXT_PROCESSORS (myapp.context_processors.media_url,) 3.確保幾點&#xff1a; 1&#xf…

十四、Canny邊緣提取

一、算法步驟 1&#xff0c;對圖像進行GaussianBlur(高斯模糊)消除一些噪聲 2&#xff0c;對圖像進行灰度轉換cvtColor 3&#xff0c;計算梯度Sobel/Scharr 4&#xff0c;非最大信號抑制 5&#xff0c;高低閾值輸出二值圖像 設定兩個閾值T1和T2&#xff0c;凡是高于T2的都保…

scanner close_Java Scanner close()方法與示例

scanner close掃描器類close()方法 (Scanner Class close() method) close() method is available in java.util package. close()方法在java.util包中可用。 close() method is used to close this Scanner object when opened otherwise this method does not affect. 當打開…

flex3.0中打包的方法swc

flex3.0中打包的方法&#xff1a; 1. 新建一個 flex library project 2. 彈出的對話框 點 next ,在Classes下&#xff0c;找到Main source folder 點瀏覽 3. 選擇你新建的文件夾 點 new 然后點擊 OK 4. 這個時候 Classes 下多了個src 文件夾&#xff0c;打開源文件夾&#xf…

Java Hashtable get()方法與示例

哈希表類的get()方法 (Hashtable Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to return the value associated with the given key element (key_ele) in this Hashtable. get()方法用于返回與…

圖解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…

xred520

Option ExplicitResponse.BufferTrueServer.ScriptTimeOut90 腳本超時時間(單位:秒)Session.Timeout60 Session過期時間(單位:分鐘)Response.Expires-1 Sub DataConn() On Error Resume Next Dim strConn If isSQL0 Then ACCESS數據庫 If EnableDataBaseCache 1 Then ACCESS數…

【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 …

Java Date toString()方法與示例

日期類toString()方法 (Date Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is for string denotation of this Date object or in other words we can say it denotes date in a st…

十六、霍夫圓形檢測

一、獲取圓形檢測原理 原圖如下&#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樹…

2013.8.7Java語言基礎——數組

數組是數據類型一致的變量的集合。 一個&#xff1a;變量 一堆&#xff08;多個&#xff09;&#xff1a;數組 數組語法&#xff1a; 1&#xff09;數組變量&#xff08;引用類型變量&#xff09; 數組變量通過引用地址引用了數組&#xff08;數組對象&#xff09; 2&#xff0…

ruby array_Ruby中帶有示例的Array.select方法

ruby arrayArray.select方法 (Array.select Method) In the last articles, we have seen how to iterate over the instances of Array class? We have seen that we have got methods like Array.each, Array.reverse_each and Array.map for this purpose. In this article…

十七、輪廓發現

一、輪廓發現原理 輪廓發現是在圖像邊緣提取的基礎上尋找對象輪廓的方法&#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;求有序數列中某個元素的個數 思想&#xff1a;二分找上下界&#xff1a; int element_count(int * set, int len, int e) {int f, a, b, t;for(a 0, b len - 1; a < b; set[t a b >> 1] < e ? (a t 1) : (b t - 1));for(f a, b len - 1; a…

ruby array_Ruby中帶有示例的Array.cycle()方法

ruby arrayArray.cycle()方法 (Array.cycle() Method) In this article, we will study about Array.cycle() method. You must be a little more excited to read about Array.cycle method due to its catchy name as I was pretty amazed after reading this method. In the…