自己做
解:先序遍历
java
复制代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<List<Integer>> res = new ArrayList();
public void preTravelTree(TreeNode root, int level){
if(root == null)
return;
if(res.size() == level){ //添加列表【新的一层】
List<Integer> new_level = new ArrayList();
new_level.add(root.val);
res.add(new_level);
}
else{ //已有列表
List<Integer> old_level = res.get(level);
if(level % 2 == 1){ //奇数层,头插
old_level.addFirst(root.val);
}
else{ //偶数层,尾插
old_level.addLast(root.val);
}
}
preTravelTree(root.left, level + 1);
preTravelTree(root.right, level + 1);
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
preTravelTree(root, 0);
return res;
}
}
自己做
解:先序遍历
java
复制代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int min_level = 0;
public void preTravelTree(TreeNode root, int level){
if(root == null)
return;
if(level > min_level)
min_level = level;
preTravelTree(root.left, level + 1);
preTravelTree(root.right, level + 1);
}
public int maxDepth(TreeNode root) {
preTravelTree(root, 1);
return min_level;
}
}
自己做
解1:划分回溯
java
复制代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int i = 0;
public TreeNode inorderTravel(int[] preorder, int[] inorder, int begin, int end){
if(begin > end) //到底了
return null;
TreeNode root = new TreeNode(preorder[i++]); //当前结点
int mid = begin; //记录划分位置
for(int j = begin; j <= end && preorder[i - 1] != inorder[mid]; j++) //找划分位置
mid++;
TreeNode left = inorderTravel(preorder, inorder, begin, mid - 1); //左子树
TreeNode right = inorderTravel(preorder, inorder, mid + 1, end); //右子树
root.left = left;
root.right =right;
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
return inorderTravel(preorder, inorder, 0, preorder.length - 1);
}
}
解2:哈希集合版
java
复制代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int i = 0;
Map<Integer, Integer> m = new HashMap(); //构建键值对集合
public TreeNode inorderTravel(int[] preorder, int[] inorder, int begin, int end){
if(begin > end) //到底了
return null;
int mid = m.get(preorder[i]); //获得分割点
TreeNode root = new TreeNode(preorder[i++]); //当前结点
TreeNode left = inorderTravel(preorder, inorder, begin, mid - 1); //左子树
TreeNode right = inorderTravel(preorder, inorder, mid + 1, end); //右子树
root.left = left;
root.right =right;
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0; i < preorder.length; i++)
m.put(preorder[i], 0);
for(int i = 0; i < preorder.length; i++)
m.put(inorder[i], i);
return inorderTravel(preorder, inorder, 0, preorder.length - 1);
}
}