一、寻找特定节点
1. 404【左叶子之和】
- 题目: 给定二叉树的根节点 root ,返回所有左叶子之和。
- 代码:
class Solution {public int sumOfLeftLeaves(TreeNode root) {if(root == null) return 0;int leftSum = 0;if(root.left!=null && root.left.left==null && root.left.right==null){leftSum = root.left.val;}else{leftSum = sumOfLeftLeaves(root.left);}int right = sumOfLeftLeaves(root.right);return leftSum+right;}
}
2. 513【找树左下角的值】
- 题目: 给定一个二叉树的 根节点 root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。
- 代码:
class Solution {public int findBottomLeftValue(TreeNode root) {Deque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);TreeNode ansNode = root;while (!queue.isEmpty()){int len = queue.size(); for (int i = 0; i < len; i++) {TreeNode tempNode = queue.poll();if(i == 0){ansNode = tempNode;}if(tempNode.left != null){queue.offer(tempNode.left);}if(tempNode.right != null){queue.offer(tempNode.right);}}}return ansNode.val;}
}
二、构造二叉树
1. 106【从中序与后序遍历序列构造二叉树】
- 题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
- 代码:
class Solution {public TreeNode buildSubTree(int[] inorder,int inStart,int inEnd,int[] postorder,int postStart,int postEnd){if(postEnd == postStart){return null;}TreeNode root = new TreeNode(postorder[postEnd-1]);int middle;for (middle = inStart; middle < inEnd ; middle++) {if(inorder[middle] == postorder[postEnd-1]){break;}}TreeNode leftNode = buildSubTree(inorder,inStart,middle,postorder,postStart,postStart+middle-inStart);TreeNode rightNode = buildSubTree(inorder,middle+1,inEnd,postorder,postStart+middle-inStart,postEnd-1);root.left = leftNode;root.right = rightNode;return root;}public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length==0 || postorder.length==0) return null;TreeNode root = buildSubTree(inorder,0,inorder.length,postorder,0,postorder.length);return root;}
}
2. 105【从前序与中序遍历序列构造二叉树】
- 题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
- 代码:
class Solution {public TreeNode buildSubTree(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){if(preEnd == preStart){return null;}TreeNode root = new TreeNode(preorder[preStart]);int middle;for(middle=inStart;middle<inEnd;middle++){if(preorder[preStart] == inorder[middle]){break;}}TreeNode leftNode = buildSubTree(preorder,preStart+1,preStart+1+middle-inStart,inorder,inStart,middle);TreeNode rightNode = buildSubTree(preorder,preStart+1+middle-inStart,preEnd,inorder,middle+1,inEnd);root.left = leftNode;root.right = rightNode;return root;}public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0 || inorder.length==0){return null;}return buildSubTree(preorder,0,preorder.length,inorder,0,inorder.length);}
}
3. 654【最大二叉树】
- 题目: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
(1)创建一个根节点,其值为 nums 中的最大值。
(2)递归地在最大值 左边 的 子数组前缀上 构建左子树。
(3)递归地在最大值 右边 的 子数组后缀上 构建右子树。
(4)返回 nums 构建的 最大二叉树 。 - 代码:
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return constructTree(nums,0,nums.length);}public TreeNode constructTree(int[] nums,int start, int end){if(end <= start){return null;}int max = nums[start];int index = start;for (int i = start; i < end; i++) {if(nums[i]>max){index = i;max = nums[i];}}TreeNode root = new TreeNode(nums[index]);TreeNode leftNode = constructTree(nums,start,index);TreeNode rightNode = constructTree(nums,index+1,end);root.left = leftNode;root.right = rightNode;return root;}
}
4. 617【合并二叉树】
- 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
- 代码:
class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1 == null) return root2;if(root2 == null) return root1;root1.val = root1.val+root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}
}