leetcode和パスII

バイナリーツリー?そして、パス!

タイトル
バイナリツリーとターゲット考えるとリーフノードにルートノードからすべてのパスを見つけるためには、パスと指定されたターゲットの合計に等しいです。
説明:リーフノードは、ノードが子ノードを持たないです。


例:
次の二分木を考えると、ターゲットとの和= 22、

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

戻り値

[ [5,4,11,2]、
[5,8,4,5]
]

トピック分析

  • 目標:ルートからリーフノードに始まるすべてのパスを見つけるため⇒その接合は目標値に等しいです
  1. リーフノードへのルートからのパスを探す⇒ 再帰的なソリューションを
  2. ノードは、目標値のパス⇒追加の和に等しい場合

問題解決のためのアイデア

変数 効果
()を見つけます パス機能を求めて

プロセス

  1. ⇒ノードのパスを更新するために、現在のノードを追加し、
  2. ノードを分析し、目標値との和に等しく、条件が満たされた場合、現在のノードがリーフノードである⇒回答にパスを追加します
  3. 左の部分木が空でない場合⇒更新は、現在のノードに繰り返しを子ノードを左2,3,4
  4. 右のサブツリーは、繰り返し、現在のノードの右の子ノードを更新⇒空にされていない場合は2,3,4

コードは以下の通りです

void find(TreeNode*root, int add, int sum, vector<int> path, vector<vector<int>> &ans)
 {
     add += root->val;                             //更新结点和
     path.push_back(root->val);                    //当前结点加入路径
     if(add == sum&&!root->left&&!root->right) ans.push_back(path);  
        if(root->left) find(root->left,add,sum,path,ans);
        if(root->right) find(root->right,add,sum,path,ans);
 } 
class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        if(!root) return{};
        vector<vector<int>> ans;
        vector<int> path;
        int add =0;
        find(root, add, sum, path, ans);
        return ans;
    }
};
公開された34元の記事 ウォンの賞賛0 ビュー576

おすすめ

転載: blog.csdn.net/Luyoom/article/details/104860955