牛客網刷題之把二叉樹列印成多行
阿新 • • 發佈:2019-01-05
題目描述:
解題思路:
這題和前面之字形列印那題類似,不同的是,判斷到達每一層重點時只需要換行即可。同樣可以用start和end兩個代表每一行的起始與終止。其他就是樹的遍歷問題了。
題解:
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(pRoot == null){
return res;
}
Queue <TreeNode> queue = new LinkedList<>();//儲存每一行結點
ArrayList<Integer> list = new ArrayList<>();//儲存結點的數值
int start = 0;
int end = 1;
queue.add(pRoot);
while(!queue.isEmpty()){
TreeNode curNode = queue.poll();
list.add(curNode. val);
start ++;
if(curNode.left != null){
queue.add(curNode.left);
}
if(curNode.right != null){
queue.add(curNode.right);
}
if(start == end){
start = 0;
end = queue. size();
res.add(list);
list = new ArrayList<>();
}
}
return res;
}
ac結果:
看討論區裡還有個哥們用的遞迴來解,這裡稍微改一下:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
depth(pRoot, 1, list);
return list;
}
private void depth(TreeNode root, int depth,
ArrayList<ArrayList<Integer>> list) {
if (root == null)
return;
if (depth > list.size())
list.add(new ArrayList<Integer>());
list.get(depth - 1).add(root.val);
depth(root.left, depth + 1, list);
depth(root.right, depth + 1, list);
}
ac結果: