11.27 log

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

class Solution {
public:
    TreeNode* traversal(vector<int> nums,int left,int right){
        if(left>=right) return NULL;
        int mid=left+(right-left)/2;
        TreeNode* root=new TreeNode(nums[mid]);
        root->left=traversal(nums,left,mid);
        root->right=traversal(nums,mid+1,right);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return traversal(nums,0,nums.size());
    }
};

这道题和由中序后序数组构造二叉树类似,我的区间划分是左闭右开。递归参数为给定的数组,左闭区间,右开区间,终止条件为当左区间值和右开区间值相等时就返回,递归内部逻辑为前序遍历,子树root值为数组mid的值,再依次向左向右遍历。 

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

class Solution {
public:
    int pre=0;
    void traversal(TreeNode* root){
        if(root==NULL) return;
        traversal(root->right);
        root->val+=pre;
        pre=root->val;
        traversal(root->left);
        return;
    }
    TreeNode* convertBST(TreeNode* root) {
        traversal(root);
        return root;
    }
};

这道题的思路就是搜索二叉树如果按中序遍历就是一个升序的有序数组,而题目要的是比它大的累加,所以遍历顺序应当是右中左。

递归参数是根节点,无返回值,终止条件是当递归到空时就返回,递归内部逻辑为右中左遍历,一个pre指针记录前一个节点的累加值,初值为0,中序的处理逻辑为当前节点值等于当前节点值加上pre,pre又等于累加后的节点值,作为下一次递归的前面节点值累加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值