一、栈 - AndyJuan/Algorithm GitHub Wiki

1、二叉树的前中后序遍历

1.1 前序遍历——leetcode 144 https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 递归算法

public List<Integer> preorderTraversal(TreeNode root) {
  List<Integer> list = new LinkedList<Integer>();
  preOrder(root,list);
  return list;
}

public void preOrder(TreeNode root, List<Integer> list){
    if (root == null){
        return;
    }
    list.add(root.val);
    preOrder(root.left,list);
    preOrder(root.right,list);
}

复杂度分析

时间复杂度:O(n)O(n),其中 nn 是二叉树的节点数。每一个节点恰好被遍历一次。

空间复杂度:O(n)O(n),为递归过程中栈的开销,平均情况下为 O(\log n)O(logn),最坏情况下树呈现链状,为 O(n)O(n)。

迭代算法(栈)

首先我们应该创建一个Stack用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack,然后打印。

之后我们应该先打印左子树,然后右子树。所以先加入Stack的就是右子树,然后左子树。

public List<Integer> preorderTraversal1(TreeNode root) {
    List<Integer> list = new LinkedList<Integer>();
    if (root == null){
        return list;
    }

    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(root);

    while (!stack.isEmpty()){
        TreeNode node = stack.pop();
        list.add(node.val);

        if (node.right!= null){
            stack.push(node.right);
        }

        if (node.left!=null){
            stack.push(node.left);
        }
    }
    return list;
}
⚠️ **GitHub.com Fallback** ⚠️