代码随想录第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结

669. 修剪二叉搜索树(二刷注意)

思路:

类似删除二叉搜索树的节点,如果root->val不在范围内则删除节点,注意需要按照左右中的顺序,先处理左子树里的不符合的节点再处理右子树不符合的节点,最后处理root节点。按照中左右如果中处理完直接return的话,在中有问题的情况下,没有处理左右子树就直接return了。

看视频后:

终止条件:root==NULL

如果val<low,则需要遍历确认root的右子树是否符合条件(右子树里可能有不符合条件的值,因此需要遍历),返回右子树给上一层父节点(通过后面的遍历承接)

如果val>high,则需要遍历root的左子树是否符合条件(左子树里可能有不符合条件的值,因此需要遍历),返回左子树给上一层父节点(通过后面的遍历承接)

遍历左子树和遍历右子树,返回root;



108.将有序数组转换为二叉搜索树

思路:

终止条件:nums.size()==0

根节点建立:使用数组中间的数建立根节点

分成左右两个数组:

vector<int> left(nums.begin(),nums.begin()+rootnum);

vector<int> right(nums.begin()+rootnum+1,nums.end());

左节点对左数组进行函数遍历,右节点对有数组进行函数遍历

最后返回根节点;

看视频后:

构造节点都是从中间开始构造,切割左右区间,注意区间的统一性。


538.把二叉搜索树转换为累加树

思路:

用双指针法,建立pre。

根据题目描述和示例发现遍历顺序为右中左。

终止条件:root==NULL

右:root->right=convertBST(root->right);

中:如果pre不为空,进行累加

if(pre!=NULL)

        {

            root->val+=pre->val;

        }

        pre=root;

左:root->left=convertBST(root->left);

最后 return root;

看视频后:

可以用int pre避免访问空指针的问题;


总结:

二叉树的题目要想到:返回值、参数是什么?终止条件是什么?单层逻辑是什么?

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,为了方便让父节点指向子节点,普通二叉树的属性还是要具体问题具体分析。

一刷掌握递归。

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

推荐阅读更多精彩内容