剑指offer(22)从上往下打印二叉树

package java_jianzhioffer_algorithm;

/**
 * 题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
 * @author hexiaoli
 * 思考:
 *    1)使用一个队列,先将根节点放入队列,
 *    每一次取出队列头节点的时候,如果该节点有子节点,则把该节点的子节点加到队列的末尾,
 *    继续取出队列头结点,直至队列中所有的节点都取出为止。
 *    
 */
import java.util.ArrayList;
class TreeNodepftb {
    int val = 0;
    TreeNodepftb left = null;
    TreeNodepftb right = null;
    public TreeNodepftb(int val) {
        this.val = val;
    }
}
public class PrintFromTopToBottom {
	
	public static ArrayList<Integer> printFromTopToBottom(TreeNodepftb root){
		ArrayList<Integer> result = new ArrayList<>();
		ArrayList<TreeNodepftb> queue = new ArrayList<>();
		// Queue<TreeNode> queue = new LinkedList<>();
		if(root == null ) {
			return result;
		}
		// 在队列中加入根节点
		queue.add(root);
		while(!queue.isEmpty()) {
			// 取出队列头结点
			TreeNodepftb temp = queue.remove(0);
			//若用Queue,TreeNode node = queue.poll();
			result.add(temp.val);
			System.out.print(temp.val+" ");
			// 如果取出的队列头结点有左子节点,则加入到队列尾,offer
			if(temp.left !=null) {
				queue.add(temp.left);
			}
			// 如果取出的队列头结点有右子节点,则加入到队列尾
			if(temp.right !=null) {
				queue.add(temp.right);
			}						
		}
		System.out.println();
		return result;
	}
	//实现分层打印
	public static ArrayList<Integer> printFromTopToBottom2(TreeNodepftb root){
		ArrayList<Integer> result = new ArrayList<>();
		ArrayList<TreeNodepftb> queue = new ArrayList<>();
		// Queue<TreeNode> queue = new LinkedList<>();
		if(root == null ) {
			return result;
		}
		// 在队列中加入根节点
		queue.add(root);
		int nextLevel = 0;
		int toBePrint = 1;
		while(!queue.isEmpty()) {
			// 取出队列头结点
			TreeNodepftb temp = queue.remove(0);
			//若用Queue,TreeNode node = queue.poll();
			result.add(temp.val);
			System.out.print(temp.val+" ");
			--toBePrint;
			// 如果取出的队列头结点有左子节点,则加入到队列尾,offer
			if(temp.left !=null) {
				queue.add(temp.left);
				nextLevel++;
			}
			// 如果取出的队列头结点有右子节点,则加入到队列尾
			if(temp.right !=null) {
				queue.add(temp.right);
				nextLevel++;
			}
			if(toBePrint == 0) {
				System.out.print('\n');
				toBePrint = nextLevel;
				nextLevel=0;
			}
		}
		
		return result;
	}
	public static void main(String[] args) {
		TreeNodepftb t1 = new TreeNodepftb(4);
		TreeNodepftb t2 = new TreeNodepftb(2);
		TreeNodepftb t3 = new TreeNodepftb(6);
		TreeNodepftb t4 = new TreeNodepftb(1);
		TreeNodepftb t5 = new TreeNodepftb(3);
		TreeNodepftb t6 = new TreeNodepftb(5);
		TreeNodepftb t7 = new TreeNodepftb(7);		
		t1.left=t2;
		t1.right=t3;
		t2.left=t4;
		t2.right=t5;
		t3.left=t6;
		t3.right=t7;
		printFromTopToBottom(t1);
		printFromTopToBottom2(t1);
	}

}

猜你喜欢

转载自blog.csdn.net/hxl0925/article/details/90032835