Leetcode144。二分木のプレオーダートラバーサル
タイトル説明
二分木のルートノードルートを与え、そのノード値のプレオーダートラバーサルを返します。
例1:
输入:root = [1,null,2,3]
输出:[1,2,3]
例2:
输入:root = []
输出:[]
例3:
输入:root = [1]
输出:[1]
例4:
输入:root = [1,2]
输出:[1,2]
例5:
输入:root = [1,null,2]
输出:[1,2]
促す:
ツリー内のノードの数は、[
0、100 ] -100 <= Node.val <= 100の範囲内です。
高度:再帰的アルゴリズムは非常に単純ですが、反復アルゴリズムを使用して実行できますか?
場所。
解決策1:再帰
関数を設計し、再帰的に呼び出してトラバーサルを実現します
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
preorderTraversal(root,list);
return list;
}
public void preorderTraversal(TreeNode root, List<Integer> list) {
if (root==null){
return;
}
list.add(root.val);
preorderTraversal(root.left,list);
preorderTraversal(root.right,list);
}
解決策2:非再帰的
テンプレート
二分木の探索は、このテンプレートに基づいて考えることができます。これに基づいて、いつでも慎重に考えることができます。
while( 栈非空 || p 非空)
{
if( p 非空)
{
}
else
{
}
}
スタックを使用して達成する
1.最初にルートノードをスタックにプッシュします
。2。ループで次の操作を実行します。スタック
の最上位要素をポップします。
スタック
の最上位ノードの左側のノードをスタックにプッシュします。の最上位ノードの子ノードをプッシュします。スタックをスタックに
public class Leetcode144_2 {
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
if (root==null){
return list ;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode node=root;
stack.add(node);
while(!stack.isEmpty()){
node=stack.pop();
list.add(node.val);
if (node.right!=null){
stack.add(node.right);
}
if (node.left!=null){
stack.add(node.left);
}
}
return list;
}