为这个题已经想了几天了,可能存在惯性思维的障碍所以一直想从递归的方式去处理,但是这个情况不太一样,用递归实在是很难找到思路,后来又转变思路,每层添加的节点放到集合里,然后去遍历集合打印左右子树然后又把子树添加到一个新集合里,这样直到打印到新建的集合没有节点为止。这里还可以继续优化,也是就放每层节点的集合每次打印完可以清空下一层继续用,不用去再生成集合。
以下我功能的实现。
public class PrintTree {
//主函数测试
public static void main(String args[])
{
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.right.right = new TreeNode(5);
ArrayList<Integer> list = PrintFromTopToBottom(root);
//打印出广度遍历
for(int i : list)
{
System.out.println(i);
}
}
/*
* 从上到下打印二叉树,广度遍历
*/
/*
* 思路就是每次添加左右子树,然后保存在第二个列表里,然后再去遍历这个内层节点的左右值
*/
public static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
//如果二叉树为空
if(root == null)
{
//返回一个空的列表
return new ArrayList<Integer>();
}
else
{
//初始化列表
ArrayList<Integer> list = new ArrayList<Integer>();
TreeNode p = root;//定义指针
//添加该引用节点的值
list.add(p.val);
while(p.left != null || p.right != null)
{
//定义一个存放所有同层节点的列表
ArrayList<TreeNode> list2 = new ArrayList<TreeNode>();
if(p.left != null)
{
list.add(p.left.val);
list2.add(p.left);
}
if(p.right != null)
{
list.add(p.right.val);
list2.add(p.right);
}
//p2指向下一层的从左到右的第一个节点
TreeNode p2 = null;
for(TreeNode treeNode : list2)
{
if(treeNode.left != null)
{
list.add(treeNode.left.val);
if(p2 == null)
{
p2 = treeNode.left;
}
}
if(treeNode.right != null)
{
list.add(treeNode.right.val);
if(p2 == null)
{
p2 = treeNode.right;
}
}
}
//p指向下一层的第一个节点
p = p2;
}
return list;
}
}
}
//定义个二叉树
class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val)
{
this.val = val;
}
}