描述
給出一棵二叉樹,返回其節點值的前序遍歷。
樣例
給出一棵二叉樹 {1,#,2,3},
1
\
2
/
3
返回 [1,2,3].
挑戰
你能使用非遞歸實現么?
前序
根左右
代碼
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
- 非遞歸+棧(重點)
PS:
注意區分stack.isEmpty()和stack == null
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Preorder in ArrayList which contains node values.
*/
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> preorder = new ArrayList<>();
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;
}
}
- 遍歷+遞歸
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Preorder in ArrayList which contains node values.
*/
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
traverse(root, result);
return result;
}
private void traverse(TreeNode root, ArrayList<Integer> result) {
if (root == null) {
return;
// return;表示不做任何操作
}
result.add(root.val);
traverse(root.left, result);
traverse(root.right, result);
}
}
- 分治+遞歸
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Preorder in ArrayList which contains node values.
*/
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (root == null) {
return result;
}
ArrayList left = preorderTraversal(root.left);
ArrayList right = preorderTraversal(root.right);
result.add(root.val);
result.addAll(left);
result.addAll(right);
// 三行代碼的添加順序不能變,即前序遍歷的根左右
return result;
}
}
關于ArrayList.addAll():
result.addAll(list); // 把list中的每一個元素加到result中,
result.size()==list.size()
result.add(list); // 將list作為一個元素加到result中,則
result.size()為1
在使用ArrayList的addAll()方法的時候一定要進行list非null的判斷