代码随想录day20 二叉树
654 构造最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
启发
1,构造二叉树中,一定是前序遍历,因为先要构造中节点再左右。
2,常规写法中每次遍历左右子树都要重新生成一个数组来放左右的元素,效率不高,可以写一个递归函数传入下标,对下标进行操作来提高效率。
617 合并二叉树
思考
1,采用递归方法,任何一种遍历方式都可以。
启发
1,利用二叉搜索树的性质来作为判断条件。
2,利用迭代法,根据二叉搜索树的性质不需要使用栈或者队列来协助,将值和遍历到的节点的值对比,小就往左走,大就往右走。
class Solution {
//方法1
/**
除了方法2以外还可以利用二叉搜索树的性质来作为判断的条件:
--二叉搜索树中左子树的所有节点的值均小于跟节点
--右子树的所有节点的值均大于跟节点
--左右子树叶分别是二叉搜索树
*/
public TreeNode searchBST(TreeNode root, int val){
if(root == null || root.val == val){
return root;
}
if(root.val > val){
return searchBST(root.left, val);
}
return searchBST(root.right, val);
}
// 方法2
// public TreeNode searchBST(TreeNode root, int val) {
// if(root == null){
// return null;
// }
// if(root.val == val){
// return root;
// }
// if(searchBST(root.left, val) != null){
// return searchBST(root.left, val);
// }
// return searchBST(root.right, val);
// }
}
98题 二叉搜索树判断
启发
1,根据二叉搜索树的性质,中序遍历结果集是单调递增的。可以将遍历结果放在一个数组中来判断,效率更高的方法是边遍历边判断,此时需要先定一个最小的值,然后遍历节点时依次比较,如果找到更小的(表明不是递增的),就要返回false。
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if(root == null){
return true;
}
//左
boolean left = isValidBST(root.left);
if(!left){
return false;
}
//中
if(max != null && root.val <= max.val){
return false;
}
max = root;
//右
boolean right = isValidBST(root.right);
return right;
}
}