参考文献链接:代码随想录
本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。
654.最大二叉树
解题思路
这道题目的意思就是从一个数组总不断的找最大值,然后拆分数组去构造左右子树。还是比较简单易想的。
代码示例
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return construct(nums);
}
public TreeNode construct(int[] nums){
//如果数组被拆分的为0,递归就结束了
if(nums.length == 0){
return null;
}
int index = 0;
int max = Integer.MIN_VALUE;
//寻找最大值
for(int i = 0;i < nums.length;i++){
if(nums[i] > max){
max = nums[i];
index = i;
}
}
//构造最大节点以及左右子树
TreeNode maxNode = new TreeNode(max);
maxNode.left = construct(Arrays.copyOfRange(nums,0,index));
maxNode.right = construct(Arrays.copyOfRange(nums,index+1,nums.length));
return maxNode;
}
}
617.合并二叉树
解题思路
这道题目就是将两个二叉树合并,我们只需要前序遍历去进行合并操作即可。当两个树都有元素时就将val值相加,否则就取其中之一当做结果值即可。
代码示例
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
TreeNode node = null;
if(root2 == null && root1 == null){
return null;
}
if(root1 != null && root2 != null){
node = new TreeNode(root1.val+root2.val);
node.left = mergeTrees(root1.left,root2.left);
node.right = mergeTrees(root1.right,root2.right);
}
if(root1 == null){
node = new TreeNode(root2.val);
node.left = mergeTrees(null,root2.left);
node.right = mergeTrees(null,root2.right);
}
if(root2 == null){
node = new TreeNode(root1.val);
node.left = mergeTrees(root1.left,null);
node.right = mergeTrees(root1.right,null);
}
return node;
}
}
700.二叉搜索树中的搜索
解题思路
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
了解了二叉搜索树的定义这道题就简单了,我们只需要判断当前值和预期值的大小,然后根据判断去左子树或者右子树继续查找知道找到目标值为止。
代码示例
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root == null){
return null;
}
if(root.val == val){
return root;
}
if(root.val > val){
return searchBST(root.left,val);
}else{
return searchBST(root.right,val);
}
}
}
98.验证二叉搜索树
解题思路
本道题首先要知道一个误区,二叉搜索树的定义:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
注意是左子树上所有结点的值均小于它的根结点的值,而不单单是root.left.val < root.val。
所以不能只是简单的去做左右判断,而要换种i思路。
我们可以使用中序遍历(左中右),从左到中到右刚好应该是递增的,我们进行比较就好。
代码示例
class Solution {
TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
if(root==null){
return true;
}
//左
boolean left = isValidBST(root.left);
//中
if(pre!=null&&pre.val>=root.val){
return false;
}
//每次记录上一个节点,去跟下一个比较
pre = root;
//右
boolean right = isValidBST(root.right);
return left&&right;
}
}