バイナリーツリー?そして、パス!
タイトル
バイナリツリーとターゲット考えるとリーフノードにルートノードからすべてのパスを見つけるためには、パスと指定されたターゲットの合計に等しいです。
説明:リーフノードは、ノードが子ノードを持たないです。
例
例:
次の二分木を考えると、ターゲットとの和= 22、
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
戻り値
:
[ [5,4,11,2]、
[5,8,4,5]
]
トピック分析
- 目標:ルートからリーフノードに始まるすべてのパスを見つけるため⇒その接合は目標値に等しいです
- リーフノードへのルートからのパスを探す⇒ 再帰的なソリューションを
- ノードは、目標値のパス⇒追加の和に等しい場合
問題解決のためのアイデア
変数 | 効果 |
---|---|
()を見つけます | パス機能を求めて |
プロセス
- ⇒ノードのパスを更新するために、現在のノードを追加し、
- ノードを分析し、目標値との和に等しく、条件が満たされた場合、現在のノードがリーフノードである⇒回答にパスを追加します
- 左の部分木が空でない場合⇒更新は、現在のノードに繰り返しを子ノードを左2,3,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;
}
};