這是剛才的Contest的第三題奠货。這題我的思路是,
第一步:算出樹的深度
第二步:BFS遍歷Tree座掘,把NULL節(jié)點(diǎn)也存下來
第三步:找出一個(gè)關(guān)于深度的公式递惋,把第二步保存的值構(gòu)造成結(jié)果
其中第二步柔滔,我一直想寫一個(gè)能夠構(gòu)造leetcode的那種serialization的函數(shù)。萍虽。這題的關(guān)鍵好像就是那個(gè)睛廊。
然后我就不想想了,怠惰杉编。后面更吧超全。好懶啊。
--
發(fā)現(xiàn)之前這個(gè)思路不太可行王财,第二步不太會卵迂。
看了下答案裕便,就是dfs做層序遍歷的那種方法绒净,在每層get相應(yīng)的list把值加進(jìn)去。
public class Solution {
private int getHeight(TreeNode root) {
if (root == null)
return 0;
return 1 + Math.max(getHeight(root.left), getHeight(root.right));
}
private void dfs(List<List<String>> res, TreeNode root, int left, int right, int level) {
//不需要也不能有l(wèi)eft>=right的條件
if (root == null)
return;
int mid = left + (right - left) / 2;
res.get(level).set(mid, String.valueOf(root.val));
dfs(res, root.left, left, mid, level + 1);
dfs(res, root.right, mid + 1, right, level + 1);
}
public List<List<String>> printTree(TreeNode root) {
int height = getHeight(root);
//左移運(yùn)算符的優(yōu)先級低偿衰,要加括號挂疆。
int width = (1 << height) - 1;
List<List<String>> res = new ArrayList<>();
for (int i = 0; i < height; i++) {
List<String> item = new ArrayList<>();
for (int j = 0; j < width; j++) {
item.add("");
}
res.add(new ArrayList<String>(item));
}
dfs(res, root, 0, width - 1, 0);
return res;
}
}
ref:
https://discuss.leetcode.com/topic/98513/simple-java-solution-easy-for-sure