二叉树|代码随想录2刷|11-34

news2024/12/28 21:41:23

222.完全二叉树的节点个数

链接:力扣

 利用完全二叉树的性质,这个更容易想到,如何计算完全二叉树的节点数 | labuladong 的算法小抄

另一个二分的方法计算太偏了,既然时间复杂度都是O(logn*logn),不如记忆简单的那个

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
   //层序遍历和深度优先的后序遍历,不过都没有用到二叉树的性质
    int countNodes(TreeNode* root) {
        TreeNode *l=root;
        int left_level=0;
        while(l!=nullptr)
        {
            left_level++;
            l=l->left;
        }

        TreeNode *r=root;
        int right_level=0;
        while(r!=nullptr)
        {
            right_level++;
            r=r->right;
        }

        if(right_level==left_level)
        {
            return static_cast<int>(pow(2,left_level)-1);
        }

        return countNodes(root->left)+countNodes(root->right)+1;

    }
    
};

110.平衡二叉树 

链接:力扣

 

 //唉,又看了一遍代码随想录,我好像总是只能想到自己的解法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        int result=depth(root);

        return (result==-1)?false:true;

    }

    int depth(TreeNode *root)
    {
        if(root==nullptr)return 0;
        
        int ld=depth(root->left);
        if(ld==-1)
        {
            return -1;
        }
         int rd=depth(root->right);
         if(rd==-1)
         {
             return -1;
         }
         if(abs(ld-rd)>1)
         {
             return -1;
         }
         return 1+max(ld,rd);
    }
};

 257. 二叉树的所有路径

链接:力扣

厌倦了

我的做法:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<string>v;
    string s;
    vector<string> binaryTreePaths(TreeNode* root) {
        if(root==nullptr)
        {
            return v;
        }

        backtracing(root,s);
        return v;

    }
    void backtracing(TreeNode *root,string s)
    {
        if(root!=nullptr)
        {
            if(root->left==nullptr &&root->right==nullptr)//叶子节点
            {
                v.push_back(s+to_string(root->val));
            }
            else
            {
               backtracing(root->left,s+to_string(root->val)+"->");
               backtracing(root->right,s+to_string(root->val)+"->");

            }
        }
    }
};

100.相同的树

链接:力扣

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {

        if(p==nullptr && q==nullptr)
        {
            return true;
        }
        if(p!=nullptr && q!=nullptr && p->val==q->val)
        {
            bool l=isSameTree(p->left,q->left);
            bool r=isSameTree(p->right,q->right);

            return l&&r;
        }
        return false;

    }
};

a

链接:

a

a

这道题有意思的地方在于,A和B在判断是否same时,不是完全相同。B遍历结束时A可以不遍历结束。

特殊例子:

这种情况下是true。所以写的函数是is_almostsame而不是is_same 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
/*
看是不是子结构,是深搜
两棵树相不相等,后序遍历
*/
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(A==nullptr || B==nullptr)
        {
            return false;
        }
        else
        {
            return is_almostsame(A,B)||isSubStructure(A->left,B)||isSubStructure(A->right,B);
            
            
        }


    }
    bool is_almostsame(TreeNode *p,TreeNode *q)
    {
        if(q==nullptr)//这里A可以不用遍历完,只要求B能遍历完
        {
            return true;
        }
        if(p!=nullptr &&q!=nullptr && p->val==q->val)
        {
            bool l=is_almostsame(p->left,q->left);
            bool r=is_almostsame(p->right,q->right);
            return l&&r;
        }
        return false;
    }
};

 y一开始写错,错的两个点:

404左叶子之和

链接:力扣 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int sum=0;
    int sumOfLeftLeaves(TreeNode* root) {  

        helper(root);
        return sum;

    }
    void helper(TreeNode *root)
    {
        if(root!=nullptr)
        {
            if(root->left!=nullptr && root->left->left==nullptr && root->left->right==nullptr)
            {
                sum+=root->left->val;
            }
                helper(root->left);
                helper(root->right);

            
        }
    }
};

513. 找树左下角的值

链接:力扣

递归前序遍历:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
int maxdepth=INT_MIN;
int result=0;//要找的那个数
    int findBottomLeftValue(TreeNode* root) {
         backtracing(root,0);
         return result;

    }
    void backtracing(TreeNode *root,int temp_depth)
    {
        //那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
        if(root!=nullptr)
        {
            if(root->left==nullptr && root->right==nullptr)
            {
                if(temp_depth>maxdepth)
                {
                    maxdepth=temp_depth;

                    result=root->val;
                }
            }
            temp_depth++;
            backtracing(root->left,temp_depth);
            backtracing(root->right,temp_depth);
            temp_depth--;

        }
    }
};

简单层序遍历:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*>q;
        q.push(root);
        int value=0;//要找的值
        while(!q.empty())
        {
           int len=q.size();
           for(int i=0;i<len;i++)
           {
            
              TreeNode *temp=q.front();
              q.pop();
               if(i==0)
               {
                   value=temp->val;
               }
              if(temp->left!=nullptr)
              {
                  q.push(temp->left);
              }
              if(temp->right!=nullptr)
              {
                  q.push(temp->right);
              }
           }
        }
        return value;

    }
};

112. 路径总和

链接:力扣

 三刷:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
   //回溯
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root!=nullptr)
        {
            if(root->left==nullptr && root->right==nullptr)
            {
               // cout<<targetSum<<endl;
                return (targetSum==root->val);
                
            }
            else
            {
                targetSum-=root->val;
                bool l=hasPathSum(root->left,targetSum);
                bool r=hasPathSum(root->right,targetSum);
                targetSum+=root->val;

                return l||r;
            }
            
        }
         return false;
    }
};

106. 从中序与后序遍历序列构造二叉树

链接:力扣

 思路明确。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    unordered_map<int,int> inorder_umap;
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int n=inorder.size();
        for(int i=0;i<n;i++)
        {
            inorder_umap.insert({inorder[i],i});
        }
        

        TreeNode *temp=helper(inorder,0,n-1,postorder,0,n-1);
        return temp;


    }
    TreeNode *helper(vector<int>&inorder, int in_start,int in_end,
                 vector<int>&postorder, int p_start,int p_end
               )
    {
        if(in_start<=in_end && p_start<= p_end)
        {
            int rootVal=postorder[p_end];
            TreeNode *root=new TreeNode(rootVal);

            int inoder_index=inorder_umap[rootVal];
            int left_length=inoder_index-in_start;
            int right_length=in_end-inoder_index;


            root->left=helper(inorder, in_start,inoder_index-1,
                              postorder,p_start,p_start+left_length-1);

            root->right=helper(inorder,inoder_index+1,in_end,
                                postorder,p_start+left_length,p_end-1);

            return root;
        }
        return nullptr;

    }
};

 654. 最大二叉树

链接:力扣

 

秒了

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        int n=nums.size();
        TreeNode *root=helper(nums,0,n-1);
        return root;

    }
    TreeNode *helper(vector<int>& nums,int start,int end)
    {
        if(start<=end)
        {
            int maxx=nums[start];
            int max_index=start;
            for(int i=start;i<=end;i++)
            {
                if(maxx<nums[i])
                {
                    maxx=nums[i];
                    max_index=i;
                }
            }
            TreeNode *root=new TreeNode(maxx);
            root->left=helper(nums,start,max_index-1);
            root->right=helper(nums,max_index+1,end);
            return root;
        }
        return nullptr;
    }
};

617. 合并二叉树

链接:力扣

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==nullptr && root2==nullptr)
        {
            return nullptr;
        }
        else if(root1==nullptr)
        {
            return root2;
        }
        else if(root2==nullptr)
        {
            return root1;
        }
        else
        {
             TreeNode *l=mergeTrees(root1->left,root2->left);
             TreeNode *r=mergeTrees(root1->right,root2->right);
             root1->val+=root2->val;
             root1->left=l;
             root1->right=r;
             return root1;
        }

    }
};

700.二叉搜索树中的搜索 ---------不太会

链接:代码随想录

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

 /*一、递归解法, 返回以该节点为根的子树
class Solution {
public:
    bool find=false;
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root==nullptr)
        {
            return nullptr;
        }
        if(val==root->val)
        {
            return root;
        }
        else if(val<root->val)//遍历左子树
        {
            return  searchBST(root->left,val);
        }
        else
        {
            return searchBST(root->right,val);
        }

    }
};
二、迭代法 */
class Solution {
public:
    bool find=false;
    TreeNode* searchBST(TreeNode* root, int val) {
        TreeNode *r=root;
        while(r!=nullptr)
        {
            if(val==r->val)
            {
                return r;
            }
            else if(val<r->val)
            {
                r=r->left;
            }
            else
            {
                r=r->right;
            }
        }
        return nullptr;
    }
};

98.验证二叉搜索树

链接:代码随想录 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
//更简单的想法确实是中序遍历,因为中序遍历一定从小到大,只需要记录当前序列的最大值,和root->val进行比较即可
public:
    bool isValidBST(TreeNode* root) {
        long long maxx=LONG_MIN;
        return helper(root,maxx);


    }
    bool helper(TreeNode *root,long long &maxx)
    {
        if(root==nullptr)
        {
            return true;
        }
       bool left= helper(root->left,maxx);
        if(root->val<=maxx)
        {
           return false;
        }
        else
        {
            maxx=root->val;
        }
        bool right =helper(root->right,maxx);
        return left && right;

    }
};

 还有种用指针记录的

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
TreeNode *pre=nullptr;
    bool isValidBST(TreeNode* root) {
        if(root!=nullptr)
        {
            bool l=isValidBST(root->left);//中序遍历
            if(pre!=nullptr)
            {
                if(pre->val>=root->val)
                {
                    return false;
                }
            }
             pre=root;
            bool r=isValidBST(root->right);//中序遍历  

            return l&&r;
        }
       return true;
    }
};

530. 二叉搜索树的最小绝对差

链接:力扣

 

递归:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode *pre=nullptr;
    int minn=INT_MAX;
    int getMinimumDifference(TreeNode* root) {
        dfs(root);
        return minn;
    }
    void dfs(TreeNode *root)
    {
        if(root!=nullptr)
        {
            dfs(root->left);
            if(pre!=nullptr)
            {
                 minn=min(minn,root->val-pre->val);

            }
            pre=root;
            dfs(root->right);
        }

    }
};

 非递归:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
 //中序遍历非递归
class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        int minn=10e5+1;
        stack<TreeNode*>sta;
        TreeNode *node=root;
        TreeNode* pre = NULL;
        while(!sta.empty()|| node!=nullptr)
        {
            while(node!=nullptr)
            {
                sta.push(node);
                node=node->left;
            }
            node=sta.top();
            /*中序遍历位置
            cout<<node->val<<endl;*/
            if(pre!=nullptr)
            {
                minn=min(minn,abs(pre->val-node->val));
            }
            pre=node;
            sta.pop();
            node=node->right;
        }
        return minn;

    }
};

501.二叉搜索树中的众数 --------不会,重新看了一遍答案

链接:力扣

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int cnt=1;
    int max_cnt=INT_MIN;
    TreeNode *pre=nullptr;
     vector<int>result;
    vector<int> findMode(TreeNode* root) {
       
        inorder(root);
        return result;


    }
    void inorder(TreeNode *root)
    {
        if(root!=nullptr)
        {
            inorder(root->left);
            if(pre==nullptr)
            {
                 cnt=1;
            }
            else if(pre->val==root->val)
            {
                   cnt++;
            }
            else
            {
                   cnt=1;
            }
               pre=root;
               if(cnt>max_cnt)
                {
                    result.clear();
                    max_cnt=cnt;
                    result.push_back(root->val);
                }
                else if(cnt==max_cnt)
                {
                    result.push_back(root->val);
                }
            inorder(root->right);

        }
    }
};

236. 二叉树的最近公共祖先 --------三刷还是不太会

链接:代码随想录

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
//乍一看还是没想法,而且和一道题搞混了
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
         if(root==nullptr) return nullptr;
         if(root==p || root==q) return root;
         TreeNode *l=lowestCommonAncestor(root->left,p,q);
         TreeNode *r=lowestCommonAncestor(root->right,p,q);
         if(l==nullptr && r==nullptr)
         {
             return nullptr;

         }
         else if(l==nullptr)
         {
             return r;
         }
         else if(r==nullptr)
         {
             return l;
         }
         else
         {
             return root;
         }

        
    }


};

235. 二叉搜索树的最近公共祖先-------没思路

链接:代码随想录

 

 很值得再做。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==nullptr)return nullptr;
        if(root->val<p->val && root->val<q->val)
        {
            return lowestCommonAncestor(root->right,p,q);
        }
        else if(root->val>p->val&& root->val>q->val)
        {
             return lowestCommonAncestor(root->left,p,q);
        }
        else
        {
            return root;

        }
        
    }
};

701.二叉搜索树中的插入操作

链接:力扣

450.删除二叉搜索树中的节点 

链接:力扣

一些错误思路,要找的节点不是父节点,就是要删除的节点

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
   /*
   被删除的节点是空、查询不到
   被删除的节点是叶子节点
    被删除的节点有左子树,右子树为空,直接以root->left替代root
   被删除的节点有左右子树,找到右子树的最小节点替代
   右子树的最小节点,在以root->right为根节点的左子树的最左边

   */
    TreeNode *pre=nullptr;//代表要找到节点的父节点
   
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr)return nullptr;
        if(root->val==key)//要被删除的节点
        {
            if(root->left==nullptr && root->right==nullptr)
            {
                root=nullptr;
            }
            else if(root->left!=nullptr && root->right==nullptr)
            {
                root=root->left;
            }
            else if(root->left==nullptr && root->right!=nullptr)
            {
                root=root->right;
            }
            else
            {
                //找到要被删除节点的右节点,找到右子树的最小节点替代 右子树的最小节点,在以root->right为根节点的左子树的最左边
                TreeNode *temp=root->right;
                TreeNode *ptr=temp;
                while(ptr->left!=nullptr)
                {
                    ptr=ptr->left;
                }
                root->val=ptr->val;
                root->right=deleteNode(root->right,ptr->val);

            }

        }
        else if(key<root->val)
        {
            root->left=deleteNode(root->left,key);
        }
        else
        {
            root->right=deleteNode(root->right,key);
        }
        return root;


        
        
       
        
    }
    
    
};

 

669. 修剪二叉搜索树 ------看不懂,只看了答案

链接:代码随想录

 

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

链接:力扣

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //二分?
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode *temp=build(nums, 0,nums.size()-1);
        return temp;

    }
    TreeNode *build(vector<int>& nums,int low,int high)
    {
        if(low<=high)
        {
            int mid=low+(high-low)/2;
            TreeNode *root=new TreeNode(nums[mid]);
            root->left=build(nums,low,mid-1);
            root->right=build(nums,mid+1,high);
            return root;

        }
        return nullptr;
        
    }
};

 

538. 把二叉搜索树转换为累加树labuladong 题解思路 

链接:力扣

 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
//后序遍历,累加值
public:
    int sum=0;
    TreeNode* convertBST(TreeNode* root) {
        helper(root);
        return root;

    }
    void helper(TreeNode *root)
    {
        if(root!=nullptr)
        {
            helper(root->right);
            sum+=root->val;
            root->val=sum;
            helper(root->left);
        }
    }
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python读写xml(xml,lxml)Edge 浏览器插件 WebTab - 免费ChatGPT

Python读写xml&#xff08;xml&#xff0c;lxml&#xff09;Edge 浏览器插件 WebTab - 免费ChatGPT XML一、xml文件创建方法一&#xff1a;使用xml.dom.minidom1、文件、标签的创建 方法二&#xff1a;使用ElementTree 二、xml文件修改1、修改标签内容&#xff0c;属性2、增加子…

flask旅游数据可视化-计算机毕设 附源码81319

flask旅游数据可视化 摘要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对旅游数据可视化等问题&…

阿里企业邮箱标准版、集团版和尊享版有什么区别?

阿里云企业邮箱版本分为免费版、标准版、集团版和尊享版&#xff0c;除了费用区别&#xff0c;功能方面有什么差异&#xff1f;如何选择企业邮箱版本&#xff1f;免费版0元适合初创型企业&#xff0c;标准版适合大、中、小型企业使用&#xff0c;涉及子公司之间邮箱通讯可以选择…

cesium多颗卫星绕着不同的轨道旋转示例

本示例的目的是介绍演示如何在vue+satellite项目中模拟多颗卫星的运行轨迹和覆盖状态。 直接复制下面的 vue+satellite源示例代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例代码相关API参考:示例效果 配置方式 1)查看基础设置:https://xiaozhuanlan.com…

knife4j 4.1.0(OpenAPI3)实现spring security或shiro权限注解内容显示

前两天写了个knife4j&#xff08;swagger2&#xff09;实现spring security或shiro权限注解内容显示&#xff0c;主要是使用knife4j 2.0.5来实现权限注解内容显示的扩展。 在Spring Boot 3 中只支持OpenAPI3规范&#xff0c;集成knife4j的stater&#xff1a;knife4j-openapi3-…

Deepin 20.08 linux 升级nvidia驱动 黑屏 报错nvrm api mismatch

驱动连接 https://us.download.nvidia.cn/XFree86/Linux-x86_64/535.54.03/NVIDIA-Linux-x86_64-535.54.03.run 安装过程 systemctl set-default multi-user.target reboot 重启到字符界面后 chmod x NVIDIA-Linux-x86_64-535.54.03.run sudo ./NVIDIA-Linux-x86_64-535.5…

C++(11):关联容器

关联容器和顺序容器有着根本的不同&#xff1a;关联容器中的元素是按关键字来保存和访问的。与之相对&#xff0c;顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 虽然关联容器的很多行为与顺序容器相同&#xff0c;但其不同之处反映了关键字的作用。 关联容器…

服务器数据中了locked勒索病毒,有关locked勒索病毒的介绍与预防建议

随着网络的普及和科技技术的发展&#xff0c;网络安全问题日益突出。而其中&#xff0c;勒索病毒就是一种常见的网络安全威胁。一旦企业的服务器数据库被勒索病毒攻击&#xff0c;会导致企业内部的重要数据被加密&#xff0c;给工作和生产生活带了极大的困扰。下面就为大家介绍…

Python工具箱系列(三十七)

二进制文件操作&#xff08;上&#xff09; python比较擅长与文本相关的操作。但现实世界中&#xff0c;对于非文本消息的处理也很普遍。例如&#xff1a; ◆通过有线、无线传递传感器获得的测量数据。 ◆卫星通过电磁波发送测量数据。 ◆数据中心的数万台服务器发送当前CP…

Android Studio 配置 DCL 单例脚本

DCL&#xff08;Double-Checked Locking&#xff09;单例是一种用于创建单例对象的设计模式。单例模式是一种创建型模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。 DCL单例的核心思想是使用双重检查来保证只有在需要时才对实例进行实例化。它结合…

MIT 6.830 数据库系统 -- Lab One

MIT 6.830 Lab One 项目拉取SimpleDB存储结构一览SimpleDB特性说明Lab One练习一练习二练习三练习四练习五练习六练习七 项目拉取 原项目使用ant进行项目构建&#xff0c;我已经更改为Maven构建&#xff0c;大家直接拉取我改好后的项目即可: https://gitee.com/DaHuYuXiXi/si…

物联网助力鲜花冷链安全——温湿度监控系统

近几年来我国花卉生产的发展尤为迅速&#xff0c;生产面积逐年扩大&#xff0c;产值成倍增长&#xff0c;内销市场越来越旺&#xff0c;出口创汇也有较大幅度上升。 随着人民生活水平的提高和可支配收入的增加&#xff0c;人们对鲜花的需求日益增长&#xff0c;花卉市场的前景…

电子药盒语音芯片ic解决方案WT588F02B-8S,免屏实现精准较时设定

概述&#xff1a;电子药盒是一种具备定时语音提醒服药的贴心智能家居用品&#xff0c;每天的服药时间是预先设定好的&#xff0c;到了设定的时间提醒声音就会响起&#xff0c;服药者因此就可以准时服药。许多需要每天服药的人士&#xff0c;尤其是老年人群体&#xff0c;经常会…

Matlab论文插图绘制模板第105期—带缺口的分组填充箱线图

在之前的文章中&#xff0c;分享了Matlab带缺口的分组箱线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下带缺口的分组填充箱线图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自…

算法leetcode|59. 螺旋矩阵 II(rust重拳出击)

文章目录 59. 螺旋矩阵 II&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 59. 螺旋矩阵 II&#xff1a; 给你一个正整数 n &#xff0c…

高速PCB设计中串行/并行信号的仿真与设计技巧

在高速PCB设计中&#xff0c;串行和并行信号的仿真是为了确保信号传输的准确性和完整性&#xff0c;随着系统数据传输速度的提高&#xff0c;准确模拟和优化信号的传输性能对于系统稳定性至关重要&#xff0c;那么你知道在高速PCB设计中&#xff0c;如何针对串行信号和并行信号…

jmeter夸线程组变量引用

通过BeanShell 后置处理程序引用函数&#xff1a; ${__setProperty(newvar,${oldvar},)}如下&#xff1a; 说明&#xff1a;HTTP_1返回结果msg的值为{“code”:200&#xff0c;“msg”:“操作成功”} 1.通过JSON提取器获取到要跨线程组的参数值 2.BeanShell后置处理程序引用…

杂谈:人到中年总得有点兴趣爱好

写在最前面&#xff1a; 前面一段写的是我咋喜欢的铜钱&#xff0c;后面一段是我对学习和转化的一点儿见解&#xff0c;有兴趣可以看看&#xff0c;甚至可以跳过前面去看看后面的内容~ 前几天跟朋友吃饭聊天&#xff0c;不知不觉中大家都到了中年&#xff0c;也都有点儿兴趣爱好…

SAP从入门到放弃系列之工艺路线-物料分配与组件分配-part1

文章概览 一、概述&#xff1a;二、基本概念&#xff1a;2.1、物料分配概览2.1.1物料适用场景&#xff1a;2.1.2物料分配方式&#xff1a; 2.2、组件分配概览2.2.1 组件适用场景2.2.2 组件分配注意事项&#xff1a; 三、测试示例3.1、准备工艺路线组数据&#xff1a;3.2、工艺路…

【Java】数组中的拷贝方法与初步理解深浅拷贝

文章目录 普通的数组拷贝函数可以指定区间拷贝的数组拷贝函数深浅拷贝 普通的数组拷贝函数 Arrays.copyOf(array,array.length) 我们进入到这个函数的源码中&#xff0c;可以看到这两个参数一个是原始数组&#xff0c;一个是拷贝后的新的长度。 例如&#xff1a; public cla…