ZigzagLevelOrderTraversalofBinaryTree题目描述:给定一棵二叉树,返回其节点值的ZigzagLevelOrderTraversal。(即先从左到右遍历,再从右到左遍历,以此类推,层与层之间交替)。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:使用队列和栈来遍历二叉树。队列的特点是先进先出,栈的特点是后进先出。因此,利用队列和栈来遍历二叉树,实现之字形遍历。具体过程如下:首先,如果root为空,则直接返回一个空的List。如果root不为空,则声明一个队列节点,将根节点加入队列,声明一个结果,并声明一个boolean类型变量directionFlag,当directionFlag为真时,将节点从左到右入栈;当directionFlag为false时,从右向左放节点,然后遍历nodes中的节点,遍历过程如下:首先用count记录当前队列中的节点个数,即第当前层的节点,以及记录当前节点值的vals,声明一个stacktemp;从nodes中依次取出count个节点,将对应的节点值放入vals中,如果当前节点的左右子节点不为空,判断是否按照从左到右的顺序或者放入温度从右到左。然后将vals添加到result结果中。取出stacktemp中的所有元素,放入nodes中。反复遍历nodes中的节点,直到nodes为空。最后返回的结果就是zigzag序列遍历的结果。说明:解法类似于LeetCode-102级顺序遍历二叉树。importjava.util.*;publicclassLeetCode_103{publicstaticList>zigzagLevelOrder(TreeNoderoot){if(root==null){returnnewArrayList<>();}List>result=newArrayList<>();Queuenodes=newLinkedList<>();节点。添加(根);//当directionFlag为true时,从左到右添加节点;当directionFlag为false时,从右到左放置节点booleandirectionFlag=true;while(!nodes.isEmpty()){intcount=nodes.size();列表<整数>vals=newArrayList<>();Stacktemp=newStack<>();while(count>0){TreeNodecurNode=nodes.poll();vals.add(curNode.val);如果(!directionFlag){如果(curNode.right!=null){temp.push(curNode.right);}如果(curNode.left!=null){temp.push(curNode.left);}}else{if(curNode.left!=null){temp.push(curNode.left);}if(curNode.right!=null){temp.push(curNode.right);}}数数-;}//取出栈中的节点放入队列while(!temp.isEmpty()){nodes.add(temp.pop());}//遍历每一层后改变顺序directionFlag=!directionFlag;结果.添加(值);}返回结果;}publicstaticvoidmain(String[]args){TreeNoderoot=newTreeNode(1);根.left=新树节点(2);root.right=newTreeNode(3);root.left.left=newTreeNode(4);root.right.right=newTreeNode(5);for(List整数:zigzagLevelOrder(root)){for(Integerinteger:integers){System.out.print(integer+"");}System.out.println();}}}【每日留言】学习的大敌是自我满足,要想认真学好东西,就要从不自满做起!