题目描述:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
这道题在分层从上到下打印二叉树的题目的思路上出发就很容易了,不难看出奇数行,是从左到右地打印列表,而偶数行是从右到左打印列表,所以在分层从上到下打印二叉树的基础上,在每行打印前添加一个flag,如果flag为true,则顺序打印列表,如果flag为false,则逆序打印列表,每一行处理后flag取反。
代码:(Java)
public class questionthree {
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right.left = new TreeNode(9);
root.right.right = new TreeNode(11);
List<List<Integer>> res = new ArrayList<>();
res = levelOrder(root);
for(int i = 0; i<res.size();i++){
System.out.println(res.get(i));
}
}
public static List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);//把根节点放进队列,开始程序
boolean flag = true; //控制列表是顺序还是逆序的标志
while(!queue.isEmpty()){ //如果队列不是空的,说明二叉树不会遍历完,如果有下一层,会在当前这层往队列里加入下一层的节点
int size = queue.size(); //首先得到当前要这一层要处理的节点数
List<Integer> curlevel = new ArrayList<>(); //初始化用来放当前这层节点的值的容器
while(--size >= 0){ //按照要处理节点的个数来处理
TreeNode cur = queue.remove(); //每处理一个节点,就把一个节点移出队列
curlevel.add(cur.val); //同时把要处理节点的值放进当前层的容器中
if(cur.left != null) queue.add(cur.left); //如果当前节点有左右子节点,就加入到队列中
if(cur.right != null) queue.add(cur.right);
}
if(flag == false) { //如果标志位false,将列表逆序
Collections.reverse(curlevel);
}
ans.add(curlevel);
flag = !flag; //下一层,flag取反
}
return ans;
}
}