您的位置:首页 > 其它

103. Binary Tree Zigzag Level Order Traversal

2017-10-23 20:00 453 查看
原题:

点击打开链接

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

思考过程:

一开始想用双向队列。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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: