【二叉樹】前序遍歷(先序遍歷)

一、題目

力扣原題: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),輔助棧

四、總結

  • 二叉樹的遍歷方式有遞歸、迭代兩種方式
  • 迭代方式的遍歷可以藉助棧實現,但需要注意棧先進先出的特性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章