拖拖拉拉的我终于在到第三十天的时候刷到了第二十天,哈哈哈
如果在刷了昨天的构造2叉树,今天这道题一看就会有一个大概的思路。
首先, 需要遍历找到最大值(不能用map是因为值在数组里的位置是有意义的)
找到的最大值即是root。
之后构造左子树: 遍历的范围要变化,从0 到找到的Ind(这里都是使用左闭右开)
再构造右子树:遍历是从Ind + 1 到数组最后
但是有一些判定有效的情况在这道题需要注意:
第一个就是:
截止条件:
- 当ind中只剩下一个数字的时候,就是递归的最后一个,就需要新建一个TreeNode 返回
- 为0的话就直接返回Null, 不用往下走,这样说的话,就说明前面一递归我允许了空区间进入(即StarInd = EndInd)这样在单层递归里处理一下,或者卡哥是直接在上一层限制了不让他进到下一层,所以加了if 判定。
还有就是在树构造的问题,都是采用的前序遍历, 因为顺序是要先建立根节点,在往下去构造左右节点再返回。
同时遍历2棵树,对同一位置的节点进行判断:
都为空:说明都要了空节点,底下不可能再有节点了。直接返回,
其中一个为空:那他的下面肯定也是空 了,直接返回另一个Node即可
递归法中,遍历的时候可以加上判定,这样搜索就有方向,可以省时省力
if (val > root.val){
//go to right
res = searchBST(root.right, val);
}
else //go to left
{
res = searchBST(root.left, val);
}
迭代法竟然更简单,因为BST的特殊性质,在寻找过程中,就不用全部都要遍历到,加上判定往特定方向走即可
if (val < root.val) root = root.left;
else if (val > root.val) root = root.right;
没有经过太多思考犯的错误: 左边的树的所有点都要小于右边,即用中序遍历节点的时候,必定是递增的。
通过这个特性,可以写出3个递进的方法:
- 遍历树,建造出一个数组,之后遍历数组,如果递增即可
- 定义一个最小的MAX_value变量,一定要比Inter 最小的数还要小,所以一定需要设置Long里的最小值,但是如果假设最小的值是Long 那怎么办?
- 进阶版,直接把最左边的数字存入变量中作为整个树的最小值:这里比较巧妙的点就是,遍历到第一个点的时候,还没来得及比较,所以只进行赋值操作。一旦赋值成功,下一次遍历就可以开始比较,代码如下:
if(pre != null && pre.val >= root.val){
return false;
}
pre = root;