みなさん、こんにちは。私はキャベツに支配されている豚です。
勉強が大好きで、眠れず、食べるのを忘れている人は、女の子のシックで落ち着いた、無関心なコーディングのハンサムな男の子に夢中です。
1.主題の内容
二分木が与えられた場合、ルートノードからリーフノードへのすべてのパスを返します。
説明:リーフ・ノードは、子ノードのないノードを指します。
例:
入力:
1
/ \
2 3
\
5
出力:["1-> 2-> 5"、 "1-> 3"]
説明:すべてのルートノードからリーフノードへのパスは次のとおりです:1-> 2-> 5、1-> 3
2つの問題解決のアイデア
深さ優先の利便性を使用し、パスを保存するパラメーターを設定します。効率を上げるためにStringBuilderクラスが使用されることに注意してください。また、String、StringBuilder、およびStringBufferの違いも具体的に確認しました。さらに、入るたびにStringBuilderを作成する必要があります。これは、前のパスに戻った後、必ず前のパスの状態に戻る必要があるため、エラーが発生しやすい場所です。ビルドされていない場合は、元のベースで直接追加されますが、これは明らかに間違っています。
今日のStringBuilderを理解することに加えて、フロントミドルポストオーダートラバーサルは深さ優先トラバーサルに基づいていることも知っています。つまり、フロント、ミドル、バックはすべて深さ優先トラバーサルです。アクセスはルートノードから始まりますが、両者の違いはルートで何かをするときです。
3、コードの実装
class Solution {
private List<String> res = new LinkedList<>();
public List<String> binaryTreePaths(TreeNode root) {
preOrder(root,"");
return res;
}
public void preOrder(TreeNode root,String path) {
if(root == null ) return;
StringBuilder builder = new StringBuilder(path);
if(root.left == null && root.right ==null) {
builder.append(root.val);
res.add(builder.toString());
return;
}
builder.append(root.val+"->");
preOrder(root.left,builder.toString());
preOrder(root.right,builder.toString());
}
}
改善後、公開コードを抽出しますが、それほど効率が良くなるとは思っていなかったので、今後コードを入力する際には、この部分の詳細に注意を払う必要があります。
class Solution {
private List<String> res = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
preOrder(root,"");
return res;
}
public void preOrder(TreeNode root,String path) {
if(root == null ) return;
StringBuilder builder = new StringBuilder(path);
builder.append(root.val);
if(root.left == null && root.right ==null) {
res.add(builder.toString());
return;
}
builder.append("->");
preOrder(root.left,builder.toString());
preOrder(root.right,builder.toString());
}
}