一、654.最大二叉树
这道题与构造二叉树类似。这种需要构造二叉树的题,一般都需要用到前序遍历。
有一个需要注意的点:**在寻找最大节点的时候,记得理清楚要遍历的范围。
以下是代码部分:
//代码随想录的解法
public TreeNode constructMaximumBinaryTree2(int[] nums) {
return getNode(nums,0,nums.length);
}
private TreeNode getNode(int[] nums, int begin, int end){
//没有节点了
if(begin == end)
return null;
TreeNode node = new TreeNode();
//叶子节点
if(begin == end - 1){
node.val = nums[begin];
return node;
}
//寻找当前数组最大值
//踩坑的地方: index 不是从0开始,也不是结束到nums.length
int index = begin,max = nums[begin];
for (int i = begin; i < end; i++) {
if(nums[i] > max){
index = i;
max = nums[i];
}
}
node.val = max;
node.left = getNode(nums, begin, index);
node.right = getNode(nums, index+1,end);
return node;
}
二、617.二叉树的合并
这道题就是通过前序遍历重新构造一个二叉树(当然也可以在先前某个二叉树的基础上修改)
以下是代码部分:
public TreeNode mergeTrees2(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;
}
三、700.二叉搜索树中的搜索
这道题就是通过二叉搜索树的特点进行一个遍历,有点类似二分查找。
这里我有一个踩坑的地方:在判断往左遍历还是往右遍历的条件一定要理清楚。
以下是代码部分:
public class 二叉搜索树中的搜索700 {
public TreeNode searchBST(TreeNode root, int val) {
if(root == null)
return null;
if(root.val == val)
return root;
//第一次踩坑了 ——>注意,这里是 大于。或者说 val < root.val
else if(root.val > val)
return searchBST(root.left, val);
else
return searchBST(root.right, val);
}
}
四、98.验证二叉搜索树
这道题刚开始做的时候踩了坑,想的只要局部子树符合要求,全局就符合要求。但是这样的想法有问题,例如:[5,4,6,null,null,3,7]
解题的思路:对二叉树进行一次中序遍历,看遍历节点的值是否为升序。
以下是代码部分:
List<Integer> res = new ArrayList<>();
//利用中序遍历
public boolean isValidBST2(TreeNode root) {
if(root == null)
return false;
//踩坑:忘记调用中序遍历
inorder(root);
for (int i = 1; i < res.size(); i++) {
//踩坑:1. 这里注意在list中取值的方式 2. 必须是大于等于(即,等于也是不行的)
if(res.get(i-1) >= res.get(i))
return false;
}
return true;
}
private void inorder(TreeNode root){
if(root == null)
return;
inorder(root.left);
res.add(root.val);
inorder(root.right);
}