代码随想录算法训练营第二十天| 654、617、700、98

 654.最大二叉树 

文档和视频讲解:代码随想录(programmercarl.com)

状态:ac

用时:1h

思路:使用前序遍历实现这个树的构造,在数组中找到最大值,并切割为左右两边的子数组,并用这两个子数组分别构造最大二叉树。递归的返回值树节点指针,参数为节点指针和数组的左右范围,范围采用左闭右开。中止条件为当左边索引大于等于右边索引。递归逻辑为,找打当前范围内最大值的索引,用这个数构建子树根节点,在分割两边分别递归。

代码:

图1



 617.合并二叉树 

文档和视频讲解:代码随想录(programmercarl.com)

状态:ac

用时:1h

思路:同时遍历两个树,当遍历到一个节点的时候,第一棵树的该位置节点不存在,第二棵树存在,则构造该位置节点时,用第二棵树的值。第一棵树该位置节点存在而第二棵不存在相反。如果两边都存在,则构造该节点的值为两边的和。

代码:

图2



 700.二叉搜索树中的搜索 

文档和视频讲解:代码随想录(programmercarl.com)

状态:ac

用时:0.5h

思路:递归的返回值用节点指针,方便找到等于给定值的节点时,返回该指针。终止条件是该节点值等于给定值或者进入空节点时。递归逻辑为大于给定值往右边走,小于往左边。

代码:

图3

 98.验证二叉搜索树 

文档和视频讲解:代码随想录(programmercarl.com)

状态:ac

用时:1.5h

思路:该题应该使用中序遍历,这样遍历树之后出来的序列是左中右,而对二叉搜索树的中序遍历出来的序列应该是从小到大递进的。遍历时从最左边的节点开始,是最小的值,因此可以使用一个变量先放最小值,每次遍历到一个节点与其比较,大于则把当前节点值赋予该变量,如果小于该变量,说明中序遍历序列不是从小到大的,则不是二叉搜索树。

    但是由于样例中包含int最小值,即INT_MIN,因此变量不能被赋予int最小值,可以是long long的最小值,不过如果样例中包含longlong最小值,又要找比它更小的值。因此,也可以用一个指针指向前一个遍历的节点来完成同样的效果,这样可以避免初始化最小值。

代码:

图4 使用最小值
图5 使用pre指针
图4 迭代法
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容