二叉树 前序遍历 迭代算法

参考的 LeetCode 题解区:LeetCode题解链接
二叉树 前序遍历 迭代算法_第1张图片
以这个二叉树为例,来展示一下遍历的过程

前提条件:

  • 假设每个节点有两个颜色:蓝色 和 白色
  • 节点第一次入栈,节点标记为蓝色
  • 节点第二次入栈,节点标记为白色
  • 如果出栈的是节点是白色的,就要把节点内的数字加入链表

因为前序遍历的过程是:中 左 右
所以节点入栈的顺序就应该是:右 左 中

二叉树 前序遍历 迭代算法_第2张图片
大概的流程

  • 5 入栈,蓝色
  • 5出栈,变为白色,然后5的右子树、左子树、自己,再依次入栈
  • 5出栈,因为5是白色的,所以 5 要加入链表
  • 3出栈,变为白色,然后3的右子树、左子树、自己,再依次入栈
  • 3出栈,因为3是白色的,所以 3 要加入链表
  • ………………
    代码
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root==null)
            return list;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            if(cur!=null){
                if(cur.right!=null)
                    stack.push(cur.right);
                if(cur.left!=null)
                    stack.push(cur.left);
                //这里在节点前加了一个空节点,表示此节点是白色的。如果之前没有空节点,此节点就是蓝色的
                stack.push(cur);
                stack.push(null);
            }else{
            	//白色的节点,要把值加入链表
                list.add(stack.pop().val);
            }
        }
        return list;
    }

你可能感兴趣的:(algorithm)