103. 二叉树的锯齿形层序遍历

自己做

解:先序遍历
/*** 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;}
}

104. 二叉树的最大深度

自己做

解:先序遍历
/*** 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;}
}

105. 从前序与中序遍历序列构造二叉树

自己做

解1:划分回溯
/*** 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:哈希集合版
/*** 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);}
}
