题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
递归的版本
这个递归的版本很有意思的地方在于他创建了一个深度的函数用来判断树的深度,然后根据深度决定root向下偏移几次。
public void PrintFromTopToBottom(TreeNode root){
int length = countDepth(root);
if(root == null || length == 0){
return;
}
for(int i=1;i<=length;i++){
printNode(root,i);
}
}
public void countDepth(TreeNode root){
if(root == 0){
return 0;
}
int l = countDepth(root.left);
int r = countDepth(root.right);
if(l > r){
return l+1;
}else{
return r+1;
}
}
public void printNode(TreeNode root,int level){
if(root == null || level < 1){ //
return ;
}
if(level == 1){
System.out.print(root.val);
return; //
}
printNode(root.left,level-1);
printNode(root.ringth,level-1);
}
非递归的版本
虽然有两种方式,但是更喜欢这个版本第一次见到了队列的用法。
一开始我的思路是递归的去实现这个方法,但是我想法特别简单的就是简单的递归,但是问题在于我递归是深度递归并不能显示同一层级的内容。
Queue的API
offer()
poll()
isEmpty()
size()
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root){
ArrayList<Intger> result = new ArrayList<Integer>();
if( root == null ) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode temp = queue.poll();
result.add(temp.val);
if(temp.left != null){
queue.offer(temp.left);
}
if(temp.left.right != null){
queue.offer(temp.right);
}
}
return result;
}