バイナリーツリー?パスを検索するには!
タイトルは
、バイナリツリー、リーフノードを返すために、ルートノードからのすべてのパスを考えます。
説明:リーフノードは、ノードが子ノードを持たないです。
例
入力:
-1
- / - \
2から3
-
\ -5
出力:[ "1-> 2-> 5"、「1 - > 3「]
説明:リーフノード・パスへのすべてのルートノード:1- > 2-> 5、1-> 3
トピック分析
- 出発点:ルートを
- 終了:リーフノード
-
ルートから始まります
-
新しいノードに到達するために一歩前進してください
-
ただ、リーフノード缶に現在のノードへのパスを探し
==>リーフノードまで、2と3を繰り返して行きます
再帰!
問題解決のためのアイデア
機能 | 効果 |
---|---|
()を見つけます | 再帰関数パスを探し |
処理し
現在のノード接合パスを
- 左と右のサブツリーが空の場合 - 現在のノードがリーフノードである - のパスを見つけるために
- 左のサブツリーが空でない場合 - リーフノードへのパス、左の子ノードを見つけます
- 右のサブツリーが空でない場合 - リーフノードへのパス右の子ノードを見つけます
コードは以下の通りです
void find (TreeNode* now,string path, vector<string> &ans)
{
string temp = to_string(now->val);
if(path=="") path = path + temp; //注意路径的开头不用添加 '->'
else path = path +'-'+'>' + temp;
if (!now->left && !now->right) ans.push_back(path); //路径加入答案
if(now->left) find(now->left,path,ans);
if(now->right) find(now->right,path,ans);
}
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
if(!root) return {};
string path;
vector<string> ans;
find(root, path, ans);
return ans;
}
};