代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

拖拖拉拉的我终于在到第三十天的时候刷到了第二十天,哈哈哈

654.最大二叉树
这道题墙裂推荐卡哥的视频

如果在刷了昨天的构造2叉树,今天这道题一看就会有一个大概的思路。

首先, 需要遍历找到最大值(不能用map是因为值在数组里的位置是有意义的)
找到的最大值即是root。
之后构造左子树: 遍历的范围要变化,从0 到找到的Ind(这里都是使用左闭右开)
再构造右子树:遍历是从Ind + 1 到数组最后

但是有一些判定有效的情况在这道题需要注意:
第一个就是:
截止条件:

  • 当ind中只剩下一个数字的时候,就是递归的最后一个,就需要新建一个TreeNode 返回
  • 为0的话就直接返回Null, 不用往下走,这样说的话,就说明前面一递归我允许了空区间进入(即StarInd = EndInd)这样在单层递归里处理一下,或者卡哥是直接在上一层限制了不让他进到下一层,所以加了if 判定。

还有就是在树构造的问题,都是采用的前序遍历, 因为顺序是要先建立根节点,在往下去构造左右节点再返回。

617.合并二叉树

同时遍历2棵树,对同一位置的节点进行判断:
都为空:说明都要了空节点,底下不可能再有节点了。直接返回,
其中一个为空:那他的下面肯定也是空 了,直接返回另一个Node即可

700.二叉搜索树中的搜索

递归法中,遍历的时候可以加上判定,这样搜索就有方向,可以省时省力

 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;

98.验证二叉搜索树

没有经过太多思考犯的错误: 左边的树的所有点都要小于右边,即用中序遍历节点的时候,必定是递增的。
通过这个特性,可以写出3个递进的方法:

  1. 遍历树,建造出一个数组,之后遍历数组,如果递增即可
  2. 定义一个最小的MAX_value变量,一定要比Inter 最小的数还要小,所以一定需要设置Long里的最小值,但是如果假设最小的值是Long 那怎么办?
  3. 进阶版,直接把最左边的数字存入变量中作为整个树的最小值:这里比较巧妙的点就是,遍历到第一个点的时候,还没来得及比较,所以只进行赋值操作。一旦赋值成功,下一次遍历就可以开始比较,代码如下:
   if(pre != null && pre.val >= root.val){         
            return false;
        }
   pre = root;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值