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

654.最大二叉树

思路:

根据昨天做的前序+中序or中序+后序的思路进行做题。1.判断数组是否为空 2.找到数组中的最大值和其位置 3.根据数组最大值构造root根节点 4.根据其位置区分左右区间 5.对左右区间进行左节点和右节点的遍历构造

看视频:

if(nums.size()==1) return root;

如果不每次构造新vector<int>,效率会提高。


 617.合并二叉树

思路:

终止条件:

if(root1==NULL && root2==NULL)return NULL;

构造根节点;

分成三种情况讨论:

root1 root2都不为空:root->val=两节点数值相加,左右节点则正常遍历root1和root2的左右节点

root1为空root2不为空:root->val=root2,左右节点遍历中的root1改为NULL;

root1不为空root2为空:root->val=root1,左右节点遍历中的root2改为NULL;

最后return root;

看视频后:

1.终止条件可改成

if(root1==NULL) return root2;

if(root2==NULL) return root1;

2.可以不额外构造树,在root1的基础上判断,在root1上操作即可;


700.二叉搜索树中的搜索

思路:

终止条件:root==NULL

分情况讨论:

相等返回root,val小于root->val继续查找左子树,大于查找右子树

看视频后:

这题迭代法也比较简单。


98.验证二叉搜索树

思路:

掉进陷阱里了:只判断了左节点比根节点小和右节点比根节点大

看视频后:

使用中序遍历,二叉搜索树在中序遍历的情况下是一个有序数组。

1. 新建函数,使用一个数组记录下二叉搜索树在中序遍历下的元素,再在原函数对数组内部顺序进行判断

2. 中序遍历过程中判断:

用双指针则不需要担心初始化的最小数和树中最小元素的比较问题

用pre记录前一个节点

中止条件:root==NULL

遍历顺序:左中右

左和右都是记录左子树和右子树的遍历情况

中:判断pre不为空且pre的值是否大于等于root的值,是则返回false

将pre=root

最后return left&&right;

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

推荐阅读更多精彩内容