LeetCode---Binary Tree Level Order Traversal、Binary Tree Level Order Traversal II解题分析

题意描述:给定一棵二叉树,按层次顺序输出。比如给定序列:{3,9,20,#,#,15,7},其对应的二叉树、从根到叶层次顺序输出、逆向层次输出依次如下

二叉树的逻辑视图:

按从根结点到叶结点层次顺序输出:

从叶结点到根结点的层次顺序输出:

解题思路:这就用到了二叉树的层次遍历,用队列依次存放每个的结点;在判断每层结束时这里用的是用一个临时链表一层时暂时存该层结点,当该链表为空时这一层遍历完毕,同时将其加入到最终的链表中

List<List<Integer>> levelOrder1(BinaryTreeLevelOrderTraversal root){
	List<List<Integer>> results = new ArrayList<List<Integer>>();
	
	if(root == null)
		return results;
			
	LinkedList<BinaryTreeLevelOrderTraversal> queue = new LinkedList<BinaryTreeLevelOrderTraversal>();
	queue.add(root);
	while(!queue.isEmpty()){//采用队列层次遍历二叉树,每访问当前结点就加入当前结点的子结点
		BinaryTreeLevelOrderTraversal lastNode = queue.getLast();//获取队列最后的一个元素
		List<Integer> list = new ArrayList<Integer>();//新声明一个链表,每次加入一层的结点信息
		while(queue.getFirst() != lastNode){//访问时标识是否为一层节点访问完毕
			BinaryTreeLevelOrderTraversal firstNode = queue.getFirst();
			list.add(firstNode.val);
			if(firstNode.left != null)
				queue.addLast(firstNode.left);
			if(firstNode.right != null)
				queue.addLast(firstNode.right);
			queue.remove(firstNode);
		}
		
		list.add(lastNode.val);
		if(lastNode.left != null)
			queue.addLast(lastNode.left);
		if(lastNode.right != null)
			queue.addLast(lastNode.right);			
		queue.removeFirst();
		
		results.add(list);
	}
	return results;
}

对于按从叶结点到根结点的顺序输出结果只用将上述的结果反转即可(这里相当于链表的逆序):

List<List<Integer>> reverseList(List<List<Integer>> results){
	if(results == null || results.size() == 1) 
		return results;
	
	for(int i=0, j=results.size()-1; i<j; i++,j--){//链表的反转
		List<Integer> temp = results.get(i);
		results.set(i, results.get(j));
		results.set(j, temp);
	}	
	
	return results;
}







你可能感兴趣的:(LeetCode---Binary Tree Level Order Traversal、Binary Tree Level Order Traversal II解题分析)