Leetcode---二叉树的锯齿形层次遍历--思路

二叉树的锯齿形层次遍历

题目链接:二叉树的锯齿形层次遍历

解题思路:
  • 思路上和普通层次遍历没有什么区别,就多了一个偶数层翻转集合顺序
  • 深度遍历使用辅助栈结构,层次遍历使用辅助队列结构,java当中List结构也可以作为队列使用
  • 通过两个数分别记录当前层和下一层的节点数
  • 一个List结构记录每一层的节点,需要翻转时将其反转
  • 一个List结构用作辅助队列,起初将root入队
  • 利用队列判断循环结束,当队列为空时,结束遍历。
  • 内层循环的作用是记录当前层节点
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
   	
   	if(root==null) {
   		return new ArrayList<List<Integer>>();
   	}
       //层次遍历二叉树
   	//翻转标志
   	boolean resverse = true;
   	//层次遍历二叉树需要一个队列,
   	LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
   	//当前层和下一层个数的计数,如果不是输出二重集合结构则不需要
   	int cur_floor = 1,next_floor = 0;
   	//返回值集合
   	List<List<Integer>> result = new ArrayList<List<Integer>>();
   	//一个临时的存储每层的List集合
   	ArrayList<Integer> temp = null;
   	TreeNode node = null;
   	queue.offer(root);
   	//当队列不为空的时候进入循环
   	while(!queue.isEmpty()) {
   		temp = new ArrayList<Integer>();
   		while(cur_floor!=0) {
   			node = queue.poll();
   			temp.add(node.val);
   			--cur_floor;
   			if(node.left!=null) {
   				queue.offer(node.left);
   				++next_floor;
   			}
   			if(node.right!=null) {
   				queue.offer(node.right);
   				++next_floor;
   			}
   		}
   		resverse = !resverse;
   		if(resverse) {
   			int len = temp.size();
   			for(int i = 0;i<len/2;i++) {
   				int t = temp.get(i);
   				temp.set(i, temp.get(len-i-1));
   				temp.set(len-i-1, t);
   			}
   		}
   		result.add(temp);
   		cur_floor = next_floor;
   		next_floor = 0;
   	}
   	return result;
   }

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/84569682
今日推荐