103. Binary Tree Zigzag Level Order Traversal

来源:互联网 发布:最好的数据恢复 编辑:程序博客网 时间:2024/06/05 21:05

原题:

点击打开链接

层次遍历二叉树,但是要求按锯齿状输出(类似于蛇形)。


思考过程:

一开始想用双向队列。Deque<TreeNode> deque = new ArrayDeque();后来发现用栈就可以实现。栈和队列顺序相反,前者先进后出,后者先进先出。有点绕,但是最终还是解决了。


解题思路:

每层创建一个栈用于储存下一层(是按下一层输出顺序的倒序储存)。这里关键在于:

如果本行是正序输出的,那么下一行按先左子节点后右子节点的顺序将下一行节点添加到栈,这样下一行出栈就按照倒序输出了;

如果本行是按倒序倒序输出的,那就按先右子节点后左子节点的顺序将下一行节点添加到栈,这样下一行就按正序输出了。


结果代码:

List<List<Integer>> ret = new ArrayList<>();    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        if (root == null) return ret;        Stack<TreeNode> stack = new Stack<>();        stack.add(root);        recursive(stack,false);        return ret;    }    public void recursive(Stack<TreeNode> stack,boolean reverse){//reverse表示这个栈里元素出栈后形成的是否翻转过,如果是,就是false        if (stack.isEmpty()) return;        Stack<TreeNode> newStack = new Stack<>();        List<Integer> subRet = new ArrayList<>();        while (!stack.isEmpty()){            TreeNode treeNode = stack.pop();            subRet.add(treeNode.val);            TreeNode left = treeNode.left;            TreeNode right = treeNode.right;            if (!reverse) {//如果栈里元素输出后是正序,下一行元素按先左后右添加子节点到新的栈                if (left != null) newStack.add(left);                if (right != null) newStack.add(right);            }            else {//如果栈里元素输出后是倒序,按先有后左顺序添加子节点到新的栈                if (right != null) newStack.add(right);                if (left != null) newStack.add(left);            }        }        ret.add(subRet);        recursive(newStack,!reverse);    }

原创粉丝点击