题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
递归方法
递归遍历二叉树,用二叉树的固定叶子序号来标记叶子数据,若某个序号没有节点,则用Integer.MAX_VALUE标记,最后删除“空节点”即不打印空节点,按叶子序号打印二叉树。这种方法是比较暴力,但是可以通过测试用例。
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//暴力定义满二叉树节点数
private static final int ARRAY_SIZE = 1000;
//用此值定义“空节点”的序号
private static final int NULL_VAL = Integer.MAX_VALUE;
//标记节点类型
private static final int NODE_ROOT = 0;
private static final int NODE_LEFT = 1;
private static final int NODE_RIGHT = 2;
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
if(null == root) {
return new ArrayList<Integer>();
}
ArrayList<Integer> array = new ArrayList<Integer>(ARRAY_SIZE);
for(int i = 0; i < ARRAY_SIZE; i ++) {
array.add(i, new Integer(NULL_VAL));
}
//递归遍历获取叶子序号列表
getNode(root, 0, array);
//返回从上往下的二叉树,即去除空节点
return sortNode(array);
}
/**
* 递归获取节点列表
* 序号根据二叉树的特征获取
* leftNodeIndex = rootIndex * 2 + 1 rightNodeIndex = rootIndex * 2 + 2
*/
private void getNode(TreeNode root, int rootIndex, ArrayList<Integer> array) {
if(null == root) {
return;
} else {
array.set(rootIndex, new Integer(root.val));
}
getNode(root.left, rootIndex * 2 + 1, array);
getNode(root.right, rootIndex * 2 + 2, array);
}
/**
* 不打印空节点
*/
private ArrayList<Integer> sortNode(ArrayList<Integer> array) {
ArrayList<Integer> returnArray = new ArrayList<Integer>();
for(int i = 0; i < array.size(); i ++) {
if(NULL_VAL != array.get(i) && null != array.get(i)) {
returnArray.add(array.get(i));
}
}
return returnArray;
}
}
队列
经人指点,选择了正确的数据结构–队列 解决这题。逻辑清晰,代码优雅。
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<Integer> resultArr = new ArrayList<Integer>();
/**
* 从根节点开始,value add到列表中,并将子节点放进队列中
* 从队列中取出一个节点,重复以上步骤,直至队列为空
*/
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
if(null == root) {
return resultArr;
}
resultArr.add(root.val);
if(null != root.left) {
queue.offer(root.left);
}
if(null != root.right) {
queue.offer(root.right);
}
return PrintFromTopToBottom(queue.poll());
}
}