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避免访问空指针的问题;
总结:
二叉树的题目要想到:返回值、参数是什么?终止条件是什么?单层逻辑是什么?
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,为了方便让父节点指向子节点,普通二叉树的属性还是要具体问题具体分析。
一刷掌握递归。