按照广度遍历去处理二叉树,但是对于每一层,设置一个布尔变量,来处理是否从右到左打印。
//如果为空节点,返回空的集合
if(pRoot == null) return new ArrayList<ArrayList<Integer>>();
//初始化一个双层链表
ArrayList<ArrayList<TreeNode>> list = new ArrayList<ArrayList<TreeNode>>();
ArrayList<TreeNode> listFloor = new ArrayList<TreeNode>();//每一层
listFloor.add(pRoot);//从左至右广度遍历
list.add(listFloor);
boolean leftToRight = true;//从右到左
while(listFloor.size() != 0)
{
ArrayList<TreeNode> listNextFloor = new ArrayList<TreeNode>();//Z型遍历
for(TreeNode treeNode : listFloor)
{
if(treeNode.left != null)
{
listNextFloor.add(treeNode.left);
}
if(treeNode.right != null)
{
listNextFloor.add(treeNode.right);
}
}
if(listNextFloor.size() != 0)
{
//颠倒顺序
if(leftToRight)
{
ArrayList<TreeNode> leftToRightList = new ArrayList<TreeNode>();
for(int i = listNextFloor.size() - 1;i >= 0;i --)
{
leftToRightList.add(listNextFloor.get(i));
}
leftToRight = false;
list.add(leftToRightList);
}
else
{
leftToRight = true;
list.add(listNextFloor);
}
}
listFloor = listNextFloor;
}
//将list里的值取出来
ArrayList<ArrayList<Integer>> treeNodeValList = new ArrayList<ArrayList<Integer>>();
for(ArrayList<TreeNode> treeList : list)
{
ArrayList<Integer> IntegerList = new ArrayList<Integer>();
for(TreeNode treeNode : treeList)
{
IntegerList.add(treeNode.val);
}
treeNodeValList.add(IntegerList);
}
return treeNodeValList;