一、題目
力扣原題:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
二、遞歸
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private List<Integer> result = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if (null == root) {
return new ArrayList<>();
}
result.add(root.val);
if (null != root.left) {
preorderTraversal(root.left);
}
if (null != root.right) {
preorderTraversal(root.right);
}
return result;
}
}
- 時間複雜度:O(n)
- 空間複雜度:
- 最優:O(log(n))。二叉樹的深度最小時
- 最差:O(n)。二叉樹退化爲鏈表時
- 平均:O(log(n))
三、迭代
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
if (null == root) {
return new ArrayList<>();
}
List<Integer> result = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.empty()) {
// 節點出棧
TreeNode node = stack.pop();
// 添加到結果集
result.add(node.val);
// 壓右節點
if (null != node.right) {
stack.add(node.right);
}
// 壓左節點
if (null != node.left) {
stack.add(node.left);
}
}
return result;
}
}
- 時間複雜度:O(n)
- 空間複雜度:O(n),輔助棧
四、總結
- 二叉樹的遍歷方式有遞歸、迭代兩種方式
- 迭代方式的遍歷可以藉助棧實現,但需要注意棧先進先出的特性