問題文
バイナリツリーを考えると、すべてのルート・ツー・葉のパスを返します。
注:葉は子を持たないノードです。
例:
入力:
1
/ \
2 3
\
5 出力:[ "1-> 2-> 5"、 "1-> 3"] 説明:すべてのルートからリーフ経路がある:1-> 2-> 5、1- > 3
問題のリンク
ビデオチュートリアル
あなたはここに詳細なビデオチュートリアルを見つけることができます
思考プロセス
簡単な問題。ルートからリーフにプリオーダートラバーサルを使用して再帰パスを保持します。ノードは、左と右の子供を持っていないときの状態を返す再帰は次のようになります。私たちが飛び出しや文字列ビルダをリセットする必要があるため、文字列ビルダを使用するよりも簡単です添付を維持するために、文字列を使用して注意してください。
警告
- 単一ノードの状況を処理するときがありません「 - >」。例えば、A-> B対A
反復もあり、実装に似て、この使用して1つのスタックの1つのスタックの問題を使用してBSTイテレータは。
ソリューション
プリオーダートラバーサル
1 プライベートリスト<文字列>のres; // 格納最終出力 2 3 パブリックリストの<string> binaryTreePaths(ツリーノードのルート){ 4 これは .RES = 新規のArrayList <> (); 5 ヘルパー(根、 "" ); 6 戻る この.RESを。 7 } 8 9 // 基本的な深さ優先トラバーサルないヘルパー機能 10 プライベート ボイドヘルパー(ツリーノードのルート、文字列str){ 11 であれば(ルート== NULL ){ 12 リターン; 13 } 14 15 であれば(root.leftは== NULL && root.right == NULL)// リーフノードに達し、従ってパスを完了し、出力にそれを追加する必要が 16 本 .res.add(STR + ルート。ヴァル); 17 他{ 18 STR + = root.val + " - >" 。 19 ヘルパー(root.left、STR)。 20 ヘルパー(root.right、STR)。 21 } 22 リターン。 23 }
時間複雑:O(N)は、各ノードが一度訪問され
スペース複雑さ:それはあなたが必要とする文字列の長さですので、O(N)、Nは総ノードであります