1. 程式人生 > >面試題 25:二叉樹中和為某一值的路徑

面試題 25:二叉樹中和為某一值的路徑

題目描述:給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。一個有效的路徑,指的是從根節點到葉節點的路徑。

今天一直被這道題困擾,思路很簡單,遞迴去判斷這個要求的和是否和已經走到的這個結點的值相比,如果相等那麼一條路徑找到,然後再去尋找其他可能存在的路徑,直到我們訪問到葉子結點為止。

思路很明確,但寫程式碼這個過程還是費了九牛二虎之力,因為有好多問題。其實反過來也說明對這個過程並沒有理解清楚。

先給出二叉樹的結構:

class TreeNode 
{
 public:
     int val;
     TreeNode *left, *right;
       TreeNode(int val
) { this->val = val; this->left = this->right = NULL; } }

很明顯,現在這個問題是用遞迴去實現的,不斷地找通過累加找那個我們訪問到的結點的val。好,下一步,我們來整理下整個問題,假如現在的值已經相等,那麼我們需要判斷當前結點是否是葉子結點,如果是葉子結點已經找到了一條符合要求的路徑,可以將這個路徑儲存下來了;反之再去訪問當前結點的左右孩子結點……按照這個想法,可以寫出程式碼如下。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution { public: /** * @param root the root of binary tree * @param target an integer * @return all valid paths */ vector<vector<int>> res; vector<int> path; vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) { // Write your code here
if(root==NULL) return res; path.push_back(root->val); if(target==root->val && root->left==NULL && root->right==NULL) res.push_back(path); if(root->left) binaryTreePathSum(root->left,target-root->val); if(root->right) binaryTreePathSum(root->right,target-root->val); if(path.size()!=0) path.pop_back(); return res; } };

問題理解的關鍵在於每次按照一條路徑去查詢,不管合不合適的時候,最後會將這個父節點pop出來,在重新找出新的路徑。

相關推薦

劍指offer{試題25中和路徑}

思路:這道題比較有意思,類似的題我在面試裡經常遇到過,圍繞著樹的深度遍歷和廣度遍歷做文章,針對這種型別的題,大家更多考慮的解決方案是遞迴,說白了二叉樹就是一群小二叉樹,上次做寶寶樹的筆試題的時候,出的演算法題就是求任意兩個節點之間的最遠距離,說白了還是遍歷的問題,回到這道題  &n

試題 25中和路徑

題目描述:給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。一個有效的路徑,指的是從根節點到葉節點的路徑。 今天一直被這道題困擾,思路很簡單,遞迴去判斷這個要求的和是否和已經走到的這個結點的值相比,如果相等那麼一條路徑找到,然後再去尋找其他

劍指Offer系列-試題25中和路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路: 程式碼: vector<vector&

劍指offer——試題25中和路徑

void FindPath(BinaryTreeNode* pRoot, int expectedSum) { if(pRoot == NULL) return;

《劍指offer》試題25中和路徑

題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路:用棧記錄路徑,sum記錄當前和。如果是葉結點,判斷sum是否等於target,如果等於則輸出。help的方法最後需要將棧頂彈出,sum

劍指Offer 試題34中和路徑 Java程式碼實現

題目:輸入一棵二叉樹和整數,打印出二叉樹中節點值得和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 解題思路:路徑從根節點開始,應該用類似於前序遍歷的方式訪問樹節點。

【劍指offer】試題34中和路徑

題目:輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)  連結:https://www.nowcoder.com/qu

劍指Offer試題25(Java版)中和路徑

題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉結點所經過的所有的結點形成一條路徑。 如下圖,輸入二叉樹和整數22,則打印出兩條路徑,第一條路徑包含結點10,12,第二條路徑包含的結點為10,5,7. 一般的資料結構

中和路徑

/** * 題目:二叉樹中和為某一值的路徑 * 描述:   輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。 *   路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑 * 方案: 

劍指offer-24中和路徑

題目描述 輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 思路 dfs演算法 程式碼 public class So

劍指Offer24中和路徑

思路: 實在沒能搞懂大佬們的思路,坐等第二遍刷再看吧 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None

劍指 Offer - 24中和路徑

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) 題目連結:https://www.nowcoder.co

劍指offer程式設計題(JAVA實現)——第24題中和路徑

github https://github.com/JasonZhangCauc/JZOffer import java.util.ArrayList; /** * * 劍指offer程式設計題

劍指offer 24中和路徑

二叉樹中和為某一值的路徑 #include <iostream> #include <vector> using namespace std; using namespace std; struct TreeNode { int val; TreeN

劍指offer25中和值得路徑

import java.util.LinkedList; import java.util.Stack; /** * Created by WHZ on 2017/4/1. */ public class offer25 { private class Tr

劍指Offer 25中和路徑 Java

對二叉樹的相關演算法還是不瞭解。 這裡有兩點是之前所用不好的: 1:把棧用進來; 2:有一個變數記錄當前的數值,這個在遞迴的過程當中就能夠得到之前的值。 package test; import java.util.Stack; public class FindPat

劍指offer——(25中和路徑

參考題解: 牛客網 深度優先搜尋(DFS):此題解中,程式執行找到[10, 5, 4]後,4為葉子節點了,remove掉4,變為[10, 5],這時執行if(root.right != null) FindPath(root.right,target); 找到[10, 5,

劍指offer中和路徑(Python)

站在巨人的肩膀上,風景這邊獨好; 親自爬上巨人的肩膀,才知風景為什麼這麼美。 題目描述 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解題思

題目11中和路徑

題目描述: 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 輸入: 每個測試案例包括n+1行: 第一行為2個整數n,k(1<=n<=10000),n表示結點的個數

Java分析中和路徑

原文地址:http://blog.csdn.net/jsqfengbao/article/details/47291207 題目:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉結點所經過的所有的結點形成一條路徑。