タイトル説明
これは、そのノードの前順トラバーサル、戻り値のバイナリツリーを、与えられています。
-
その左右の息子の息子のノード値が続くルートノードとしての第1のデータは、「#」は、子ノードが存在しないことを示しています。
- ノード数が20を超えません
例1:
输入:{1,2,3}
输出:[1,2,3]
解释:
1
/ \
2 3
它将被序列化为{1,2,3}
前序遍历
サンプル2:
输入:{1,#,2,3}
输出:[1,2,3]
解释:
1
\
2
/
3
它将被序列化为{1,#,2,3}
前序遍历
問題の解決策
プリオーダートラバーサル非再帰的な方法は、現在のノードが第1の値が格納されている場合、次いで、スタックにプッシュ最初の右の息子がスタックに彼の息子を残しました。スタックトラバーサルアクセスの要素。
システムやコンピュータネットワークを操作する国内メーカーへのインタビューに加えて、これらの基盤は、だけでなく、マスターする必要があるアルゴリズムとデータ構造を。ブラシは、その後で、当然のことながら、少なくとも3ヶ月を取り、独自の質問を準備するために、アルゴリズムのコースに多くの時間を節約することができ、一般的に、高速で、その後、月は巨大なアルゴリズムのインタビューに対処することができるようになります。
Version 0: Non-Recursion (Recommend)
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> preorder = new ArrayList<Integer>();
if (root == null) {
return preorder;
}
stack.push(root);
while (!stack.empty()) {
TreeNode node = stack.pop();
preorder.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return preorder;
}
}
//Version 1: Traverse
public class Solution {
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
traverse(root, result);
return result;
}
// 把root为跟的preorder加入result里面
private void traverse(TreeNode root, ArrayList<Integer> result) {
if (root == null) {
return;
}
result.add(root.val);
traverse(root.left, result);
traverse(root.right, result);
}
}
//Version 2: Divide & Conquer
public class Solution {
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
// null or leaf
if (root == null) {
return result;
}
// Divide
ArrayList<Integer> left = preorderTraversal(root.left);
ArrayList<Integer> right = preorderTraversal(root.right);
// Conquer
result.add(root.val);
result.addAll(left);
result.addAll(right);
return result;
}
}