剑指 Offer 32 - III. 从上到下打印二叉树 III

问题描述

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

示例

给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null)
			 return new ArrayList<List<Integer>>();
		 	List<List<Integer>> res=new ArrayList<List<Integer>>();
		 	//正着先右,倒着先左
		 	List<TreeNode> objective=new ArrayList<TreeNode>();
		 	objective.add(root);
		 	List<Integer> t=new ArrayList<Integer>(1);
		 	t.add(root.val);
		 	res.add(t);
		 	List<TreeNode> negetive=new ArrayList<TreeNode>();
		 	while(objective.size()>0) {
		 	List<Integer> t1=new ArrayList<Integer>();
		 	for(int i=objective.size()-1;i>=0;i--) {
		 		if(objective.get(i).right!=null) {
		 			t1.add(objective.get(i).right.val);
		 			negetive.add(objective.get(i).right);
		 		}
		 		if(objective.get(i).left!=null) {
		 			t1.add(objective.get(i).left.val);
		 			negetive.add(objective.get(i).left);
		 		}
		 	}
		 	if(t1.size()>0)
		 	res.add(t1);
		 	objective.clear();
		 	if(negetive.size()>0) {
			 	List<Integer> t2=new ArrayList<Integer>();
			 	for(int i=negetive.size()-1;i>=0;i--) {
			 		if(negetive.get(i).left!=null) {
			 			t2.add(negetive.get(i).left.val);
			 			objective.add(negetive.get(i).left);
			 		}
			 		if(negetive.get(i).right!=null) {
			 			t2.add(negetive.get(i).right.val);
			 			objective.add(negetive.get(i).right);
			 		}
			 	}
			 	if(t2.size()>0)
			 	res.add(t2);
			 	negetive.clear();
		 	}
		 	}
		 	return res;
    }
}

posted @ 2021-03-02 14:10  小帆敲代码  阅读(38)  评论(0编辑  收藏  举报