• leetcode(c++)二叉树


    #include <iostream>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <string>
    #include <list>
    #include <unordered_map>
    #include <unordered_set>
    using namespace std;
    
    class TreeNode{
        public:
        TreeNode(int val):val_(val){}
        int val_;
        TreeNode* left = nullptr;
        TreeNode* right = nullptr;
    };
    
    
    void v_print(const vector<int>&vs)
    {
        for(const auto v: vs)
        {
            cout << v << " ";
        }
        cout << endl;
    }
    
    void v_print(const vector<vector<int>>&vss)
    {
        for(const std::vector<int>& vs:vss)
        {
            for(const auto v:vs)
            {
                cout << v << " ";
            }
            cout << endl;
        }
    }
    
    void pre(TreeNode* root)
    {
        if(nullptr == root)
        {
            return;
        }
        cout << root->val_ << endl;
        pre(root->left);
        pre(root->right);
    }
    
    void pre(TreeNode* root, vector<int>&res)
    {
        stack<TreeNode*>st;
       if(root != nullptr)
       {
           st.push(root);
       }
       while(!st.empty())
       {
           root = st.top();
           st.pop();
           res.push_back(root->val_);
           if((root->right != nullptr))st.push(root->right);
           if(root->left != nullptr)st.push(root->left);
       }
       return;
    
    }
    
    void pre2(TreeNode* root, vector<int>&res)
    {
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(nullptr != cur || !st.empty())
        {
            if(cur != nullptr)
            {
                res.push_back(cur->val_);
                st.push(cur);
                cur = cur->left;
            }
            else
            {
                cur = st.top();
                st.pop();
                cur = cur->right;
            }
        }
        return;
    }
    
    void inorder(TreeNode* root)
    {
        if(root == nullptr)return;
        inorder(root->left);
        cout << root->val_ << endl;
        inorder(root->right);
    }
    void inorder(TreeNode* root, vector<int>&res)
    {
        stack<TreeNode*>st;
        while(root != nullptr || !st.empty())
        {
            while(root != nullptr)
            {
                st.push(root);
                root = root->left;
            }
            root = st.top();
            st.pop();
            res.push_back(root->val_);
            root = root->right;
        }
    }
    
    void inorder2(TreeNode* root, vector<int>&res)
    {
        stack<TreeNode*>st;
        TreeNode* cur = root;
        while(cur != nullptr || !st.empty())
        {
            if(cur != nullptr)
            {
                st.push(cur);
                cur = cur->left;
            }
            else
            {
                cur = st.top();
                st.pop();
                res.push_back(cur->val_);
                cur = cur->right;
            }
        }
        return;
    }
    
    void pos(TreeNode* root)
    {
        if(nullptr == root)
        {
            return ;
        }
        if(root->left != nullptr)pos(root->left);
        if(root->right != nullptr)pos(root->right);
        cout << root->val_ << endl;
    }
    
    void pos(TreeNode* root, vector<int>&res)
    {
        stack<TreeNode*>st;
        if(root != nullptr)st.push(root);
        while(!st.empty())
        {
            root = st.top();
            st.pop();
            res.push_back(root->val_);
            if(root->left)st.push(root->left);
            if(root->right)st.push(root->right);
        }
        reverse(res.begin(),res.end());
        return;
    }
    
    void pos1(TreeNode* root,vector<int>&res)
    {
        stack<TreeNode*>st;
        stack<TreeNode*>st1;
        TreeNode* cur = root;
        while(cur != nullptr || !st.empty())
        {
            if(cur)
            {
                st.push(cur);
                st1.push(cur);
                cur = cur->right;
            }
            else
            {
                cur = st.top();
                st.pop();
                cur = cur->left;
            }
        }
        while(!st1.empty())
        {
            res.push_back(st1.top()->val_);
            st1.pop();
        }
        return ;
    }
    
    void levelOrder(TreeNode* root,vector<vector<int>>& res)
    {
        queue<TreeNode*>q;
        if(root != nullptr)q.push(root);
        while(!q.empty())
        {
            int size = q.size();
            vector<int>tmp;
            for(int i = 0; i < size; ++i)
            {
                auto cur = q.front();
                q.pop();
                tmp.push_back(cur->val_);
                if(cur->left)q.push(cur->left);
                if(cur->right)q.push(cur->right);
            }
            res.push_back(tmp);
        }
        return ;
    }
    
    void levelOrder(TreeNode* root,vector<vector<int>>&res,int index)
    {
        if(root == nullptr)return;
        if(index == res.size())res.push_back({});
        res[index].push_back(root->val_);
        if(root->left != nullptr)levelOrder(root->left,res,index+1);
        if(root->right!= nullptr)levelOrder(root->right,res,index+1);
        return;
    }
    
    void levelOrder1(TreeNode* root,vector<vector<int>>&res)
    {
        levelOrder(root,res,0);
        return ;
    }
    
    void zigzagLevelOrder(TreeNode* root, vector<vector<int>>&res)
    {
        queue<TreeNode*>q;
        if(root)q.push(root);
        while(!q.empty())
        {
            int size = q.size();
            vector<int>tmp;
            for(int i = 0; i < size; ++i)
            {
                auto cur = q.front();
                q.pop();
                tmp.push_back(cur->val_);
                if(cur->left) q.push(cur->left);
                if(cur->right)q.push(cur->right);
            }
            res.push_back(tmp);
        }
        for(int i = 0; i < res.size(); ++i)
        {
            if(i % 2 != 0)
            {
                reverse(res[i].begin(),res[i].end());
            }
        }
        return;
    }
    
    void split(const string &s, const string &sep, list<string> &ret) {
        unsigned int pos_start =0, pos=0;
        while(true) {
            pos = s.find(sep, pos_start);
            if(-1==pos)
                break;
            ret.emplace_back(s.substr(pos_start, pos-pos_start));
            pos_start = pos+1;
        }
        ret.emplace_back(s.substr(pos_start));
    }
    
    string serialize(TreeNode* root)
    {
        if(root == nullptr) return "#";
        return to_string(root->val_) + "," + serialize(root->left) + "," + serialize(root->right);
    }
    
    TreeNode* help( queue<string>& q)
    {
    
        string cur = q.front();
        q.pop();
        if(cur == "#")return nullptr;
        TreeNode* n = new TreeNode(stoi(cur));
        n->left = help(q);
        n->right = help(q);
       return n;
    }
    
    TreeNode* deserialize(string data)
    {
        list<string>datas;
        queue<string>q;
        split(data,",",datas);
        for(auto str:datas)
        {
            q.push(str);
        }
        return help(q);
    }
    
    int index_bst = 0;
    TreeNode* help(const vector<int>& preorder, int lower,int upper,int N)
    {
        if(index_bst == N)return nullptr;
        int val = preorder[index_bst];
        if(val < lower || val > upper)return nullptr;
        ++index_bst;
        TreeNode* root = new TreeNode(val);
        root->left = help(preorder,lower,val,N);
        root->right = help(preorder,val,upper,N);
        pre(root);
        cout << "==="<<endl;
        return root;
    }
    
    TreeNode* bstFromPreorder(const vector<int>& preorder)
    {
        int N = preorder.size();
        return help(preorder,INT_MIN,INT_MAX,N);
    }
    
    int preOrderIndex = 0;
    TreeNode* help(vector<int>&pre,int start,int end,unordered_map<int,int>&map)
    {
        if(start > end)return nullptr;
        TreeNode* root = new TreeNode(pre[preOrderIndex++]);
        int index = map[root->val_];
        root->left = help(pre,start,index-1,map);
        root->right = help(pre,index+1,end,map);
        return root;
    }
    
    TreeNode* buildTreeFromPreIn(vector<int>&pre,vector<int>&in)
    {
        int N = pre.size();
        unordered_map<int,int>map;
        for(int i = 0; i < N; ++i)
        {
            map[in[i]] = i;
        }
        return help(pre,0,N-1,map);
    }
    
    TreeNode* help(vector<int>& pos,int inS,int inE,int posS,int posE,unordered_map<int,int>&map)
    {
        if(inS > inE)return nullptr;
        TreeNode* root = new TreeNode(pos[posE]);
        int inIndex = map[root->val_];
        int rightTreeSize = inE - inIndex;
        root->left = help(pos,inS,inIndex-1,posS,posE - rightTreeSize - 1,map);
        root->right = help(pos,inIndex + 1, inE,posE-rightTreeSize,posE-1,map);
        return root;
    
    }
    
    TreeNode* buildTreeFromInPos(vector<int>&in,vector<int>&pos)
    {
        int N = in.size();
        unordered_map<int,int>map;
        for(int i = 0; i < N; ++i)
        {
            map[in[i]] = i;
        }
        return help(pos,0,N-1,0,N-1,map);
    }
    
    int preSt = 0;
    TreeNode* build(vector<int>&preV,unordered_map<int,int>&map,int posS,int posE,int N)
    {
        if(preSt >= N ||posS > posE)return nullptr;
        TreeNode* root = new TreeNode(preV[preSt++]);
        if(preSt == N || posS == posE)return root;
        int posIndex = map[preV[preSt]];
        root->left = build(preV,map,posS,posIndex,N);
        root->right = build(preV,map,posIndex + 1, posE-1,N);
        return root;
    }
    
    TreeNode* buildTreeFromPrePos(vector<int>&preV,vector<int>&posV) {
        int N = preV.size();
        unordered_map<int, int> map;
        for (int i = 0; i < N; ++i)
        {
            map[posV[i]] = i;
        }
        return build(preV,map,0,N-1,N);
    }
    
    void inorder(TreeNode* root, TreeNode* pre, TreeNode* head)
    {
        if(root == nullptr)return;
        inorder(root->left,pre,head);
        if(head == nullptr)head = root;
        if(pre!= nullptr)pre->right = root;
        root->left = pre;
        pre = root;
        inorder(root->right);
    }
    
    TreeNode* TreeToDoubleyList(TreeNode* root)
    {
        if(root == nullptr)return nullptr;
        TreeNode* pre = nullptr,*head = nullptr;
        inorder(root,pre,head);
    }
    
    int minVal = INT_MAX;
    int closestVal = 0;
    int dfs(TreeNode* root, double target)
    {
    
        if(root == nullptr)return -1;
        if(abs(root->val_ - target) < minVal)
        {
            minVal = abs(target-root->val_);
            closestVal = root->val_;
        }
        if(root->val_ > target)dfs(root->left,target);
        else dfs(root->right,target);
    }
    
    
    int dfs2(TreeNode* root, double target)
    {
        TreeNode* cur = root;
        while(true)
        {
            if(cur == nullptr)return -1;
            if(abs(root->val_ - target) < minVal)
            {
                minVal = abs(target-root->val_);
                closestVal = root->val_;
            }
            if(cur->val_ < target)cur = cur->right;
            else cur = cur->left;
        }
    
    }
    
    int closestValue(TreeNode* root, double target)
    {
        //递归
    //    dfs(root,target);
        //迭代
        dfs2(root,target);
        return closestVal;
    }
    
    int findMin(TreeNode* root)
    {
        while(root->left != nullptr)root = root->left;
        return root->val_;
    }
    
    
    TreeNode* deleteNode(TreeNode* root, int key)
    {
        if(root == nullptr) return nullptr;
        if(key < root->val_) root->left = deleteNode(root->left,key);
        else if(key > root->val_)root->right = deleteNode(root->right,key);
        else if(root->left == nullptr)return root->right;
        else if(root->right == nullptr)return root->left;
        else
        {
            root->val_ = findMin(root->right);
            root->right = deleteNode(root->right,root->val_);
        }
        return root;
    }
    
    bool isValidBST(TreeNode* root, int max,int min)
    {
        if(root == nullptr)return  true;
        if(max != -1 && root->val_ >= max)return false;
        if(min != -1 && root->val_ <= min)return false;
        return isValidBST(root->left,root->val_,min) && isValidBST(root->right,max,root->val_);
    }
    
    int preV = INT_MIN;
    bool isValidBST(TreeNode* root)
    {
          //递归
    //      if(root == nullptr)return true;
    //      bool left = isValidBST(root->left);
    //      bool right = isValidBST(root->right);
    //      if(!left)return false;
    //      if(root->val_ <= preV)return false;
    //      return isValidBST(root->right);
          //递归
    
          //非递归
          TreeNode* pre = nullptr;
          stack<TreeNode*>st;
          while(root!= nullptr||!st.empty())
          {
              while(root != nullptr)
              {
                  st.push(root);
                  root = root->left;
              }
              root = st.top();
              st.pop();
              if(pre!= nullptr && root->val_ <=pre->val_)return false;
              pre = root;
              root=root->right;
          }
          return true;
    
    //    return isValidBST(root, -1, -1);
    }
    
    void recover(TreeNode* node)
    {
        TreeNode* first = nullptr, *second = nullptr;
        TreeNode* prev = new TreeNode(INT_MIN);
        stack<TreeNode*>st;
        while(node != nullptr || !st.empty())
        {
            while(node != nullptr)
            {
                st.push(node);
                node = node->left;
            }
            node = st.top();
            st.pop();
            if(node->val_ <= prev->val_)
            {
                if(first == nullptr)
                {
                    first = prev;
                    second = node;
                }
                else
                {
                    second = node;
                }
            }
            prev = node;
            node = node->right;
        }
        int tmp = first->val_;
        first->val_ = second->val_;
        second->val_ = tmp;
    }
    
    TreeNode* prevR = new TreeNode(INT_MIN);
    TreeNode* first = nullptr, *second = nullptr;
    void inorderR(TreeNode* root)
    {
        if(root == nullptr)return;
        inorderR(root->left);
        if(prevR->val_ > root->val_)
        {
            if(first == nullptr)
            {
                first = prevR;
                second = root;
            }
            else
            {
                second = root;
            }
        }
        prevR = root;
        inorderR(root->right);
    }
    
    void recover2(TreeNode* root)
    {
    
        if(root == nullptr)return ;
        inorderR(root);
        if(first != nullptr && second != nullptr)
        {
            int tmp = first->val_;
            first->val_ = second->val_;
            second->val_ = tmp;
        }
        return ;
    }
    
    TreeNode* help(vector<int>& nums,int start,int end)
    {
        if(start > end) return nullptr;
        int mid = start + (end - start) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = help(nums,start,mid - 1);
        root->right = help(nums,mid + 1,end);
        return root;
    
    }
    
    TreeNode* sortedArrayToBST(vector<int>&nums)
    {
        return help(nums,0,nums.size() - 1);
    }
    
    void dfs(TreeNode* root,vector<int>&res)
    {
        if(root == nullptr)return;
        dfs(root->left,res);
        res.push_back(root->val_);
        dfs(root->right,res);
        return;
    }
    TreeNode* balanceBST(TreeNode* root)
    {
        vector<int>res;
        dfs(root,res);
        return sortedArrayToBST(res);
    }
    
    int numTrees(int n)
    {
        vector<int>G(n+1);
        G[0] = 1;
        G[1] = 1;
        for(int i = 2; i <= n; ++i)
        {
            for(int j = 1; j <= i; ++j)
            {
                G[i] += G[j-1]*G[i-j];
            }
        }
        return G[n];
    }
    
    vector<TreeNode*>help(int st,int ed)
    {
        vector<TreeNode*>res;
        if(st > ed)res.push_back(nullptr);
        for(int i = st; i <= ed;++i)
        {
            vector<TreeNode*> leftList = help(st,i-1);
            vector<TreeNode*> rightList = help(i+1,ed);
            for(TreeNode* left : leftList)
            {
                for(TreeNode* right:rightList)
                {
                    TreeNode* root = new TreeNode(i);
                    root->left = left;
                    root->right = right;
                    res.push_back(root);
                }
            }
    
        }
        return res;
    }
    
    vector<TreeNode*> generateTrees(int n)
    {
        if(n == 0) return {};
        return help(1,n);
    }
    
    TreeNode* lowestCommonAncestor(TreeNode* root,TreeNode*p,TreeNode*q)
    {
        if(root->val_ >p->val_ && root->val_ >q->val_)return lowestCommonAncestor(root->left,p,q);
        if(root->val_ <p->val_ && root->val_ < q->val_)return lowestCommonAncestor(root->right,p,q);
        return root;
    }
    
    TreeNode* lowestCommonAncestor1(TreeNode* root,TreeNode* p,TreeNode* q)
    {
        while(true)
        {
            if(root->val_ >p->val_ && root->val_>q->val_)root = root->left;
            else if(root->val_ < p->val_ && root->val_ < q->val_)root = root->right;
            else return root;
        }
    }
    
    int cnt = 0;
    TreeNode* LCA(TreeNode* root, TreeNode* p,TreeNode* q)
    {
        if(root == nullptr)return root;
        TreeNode* left = LCA(root->left,p,q);
        TreeNode* right = LCA(root->right,p,q);
        if(root->val_ == p->val_ || root->val_ == q->val_)
        {
            ++cnt;
            return root;
        }
        return left == nullptr ? right:right == nullptr ?left:root;
    }
    TreeNode* lowestCommonAncestor2(TreeNode* root,TreeNode* p,TreeNode* q)
    {
        TreeNode* lca = LCA(root,p,q);
        return cnt == 2 ? lca: nullptr;
    
    }
    
    TreeNode* dfs(TreeNode* root, unordered_set<int>&set)
    {
        if(root == nullptr)return root;
        if(set.count(root->val_))return root;
        TreeNode* left = dfs(root->left,set);
        TreeNode* right = dfs(root->right,set);
        if(left != nullptr && right != nullptr)return root;
        if(left != nullptr)return left;
        if(right != nullptr)return right;
        return nullptr;
    }
    
    TreeNode* lowestCommonAncestor(TreeNode* root, vector<TreeNode*>nodes)
    {
        unordered_set<int>set;
        for(TreeNode* node :nodes)
        {
            set.insert(node->val_);
        }
        return dfs(root,set);
    }
    
    void helper(TreeNode*root,string path,vector<string>&res)
    {
        if(root->left == nullptr && root->right == nullptr)res.push_back(path);
        if(root->left != nullptr)helper(root->left,path+"->"+ to_string(root->left->val_),res);
        if(root->right!= nullptr)helper(root->right,path+"->"+ to_string(root->right->val_),res);
    }
    
    vector<string>binaryTreePaths(TreeNode* root)
    {
        vector<string>res;
        if(root!= nullptr)helper(root, to_string(root->val_),res);
        return res;
    }
    
    int res = 0;
    void dfsG(TreeNode* root,int maxVal)
    {
        if(root == nullptr)return;
        if(root->val_>= maxVal)++res;
        dfsG(root->left,max(maxVal,root->val_));
        dfsG(root->right,max(maxVal,root->val_));
        return;
    }
    int goodNodes(TreeNode* root)
    {
        dfsG(root,INT_MIN);
        return res;
    }
    
    int maxVal = INT_MIN;
    
    int helper(TreeNode* root)
    {
        if(root == nullptr)return 0;
        int left = max(0, helper(root->left));
        int right = max(0,helper(root->right));
        maxVal = max(maxVal,left + right + root->val_);
        return max(left,right) + root->val_;
    }
    
    int maxSum(TreeNode* root)
    {
        helper(root);
        return maxVal;
    }
    
    double maxAvg = 0;
    vector<int> sumTree(TreeNode* root)
    {
        if(root == nullptr)return vector<int>(2);
        vector<int>res(2);
        auto left = sumTree(root->left);
        auto right = sumTree(root->right);
        res[0] = left[0] + right[0]+root->val_;
        res[1] = left[1] + right[1] + 1;
        maxAvg = max(maxAvg,double(res[0])/double (res[1]));
        return  res;
    }
    
    double maxAverageSubtree(TreeNode* root)
    {
        maxAvg = 0;
        sumTree(root);
        return maxAvg;
    }
    
    int maxx = INT_MIN;
    
    vector<int>dfs(TreeNode* root)
    {
        vector<int>res(2);
        if(root == nullptr)return vector<int>(2);
        auto left = dfs(root->left);
        auto right = dfs(root->right);
        res[0] = left[1] + 1;//左孩子的rightSum
        res[1] = right[0] + 1;//右孩子的leftSum
        maxx = max(maxx,max(res[0],res[1]));
        return res;
    }
    
    int longestZigZag(TreeNode* root)
    {
        dfs(root);
        return maxx == 0 ? 0 : maxx - 1;
    }
    
    class Pair
    {
    public:
    
        Pair(TreeNode* node,int depth):node_(node),depth_(depth)
        {
        }
        TreeNode* node_ = nullptr;
        int depth_ = 0;
    
    };
    
    Pair getLca(TreeNode* root, int depth)
    {
        if(root == nullptr)return Pair(nullptr,depth);
        auto left =getLca(root->left,depth + 1);
        auto right = getLca(root->right,depth + 1);
        if(left.depth_ == right.depth_)
        {
            return Pair(root,left.depth_);
        }
        else
            return left.depth_ > right.depth_ ? left:right;
    }
    
    TreeNode* lcaDeepestLeaves(TreeNode* root)
    {
        Pair pair = getLca(root,0);
        return pair.node_;
    }
    
    int maxVal0 = INT_MIN;
    
    vector<int>longestPath(TreeNode* root)
    {
        if(root== nullptr)return {0,0};
        int inr = 1,dcr = 1; //inr表示child里最长上升子序列包含当前node,dcr为最长下降子序列;
        if(root->left != nullptr)
        {
            auto l = longestPath(root->left);
            if(root->val_ == root->left->val_+1)dcr = l[1] + 1;
            else if(root->val_ == root->left->val_-1)inr = l[0] + 1;
        }
        if(root->right != nullptr)
        {
            auto r = longestPath(root->right);
            if(root->val_ == root->right->val_ + 1)dcr = max(dcr,r[1] + 1);
            else if(root->val_ == root->right->val_-1)inr = max(inr,r[0]+1);
        }
        maxVal0 = max(maxVal0,dcr+inr-1);
        return {inr,dcr};
    }
    
    int longestConsecutive(TreeNode* root)
    {
        longestPath(root);
        return maxVal0;
    }
    
    int main()
    {
        TreeNode a(0);
        TreeNode b(1);
        TreeNode c(2);
        TreeNode d(3);
        TreeNode e(4);
        TreeNode f(5);
        TreeNode g(6);
        b.left = &d;
        b.right = &e;
        c.left = &f;
        c.right = &g;
        a.left = &b;
        a.right = &c;
        TreeNode root = a;
    
    #define path
    
    #ifdef PRE
        //二叉树三种遍历方式 递归+非递归
        vector<int>res,res1;
    
        pre(&root,res);
        pre2(&root,res1);
        pre(&root);
    
        inorder(&root);
        inorder(&root,res);
        inorder2(&root,res1);
    
        pos(&root);
        pos(&root,res);
        pos1(&root,res1);
    
        v_print(res);
        v_print(res1);
    
    #elifdef level
    
        vector<vector<int>>res,res1;
    
        //二叉树的层序遍历
        levelOrder(&root,res);
        levelOrder1(&root,res1);
    
        //之字形打印二叉树
        zigzagLevelOrder(&root,res);
    
        v_print(res);
        v_print(res1);
    
    #elifdef construct
    
    //    二叉树的序列化及反序列化
    //    string res = serialize(&root);
    //    cout << res << endl;
    //    pre(deserialize(res));
    
    
        vector<vector<int>>res;
    
    //    //根据前序遍历构建二叉搜索树
    //    vector<int>preorder{8,5,1,7,10,12};
    //    levelOrder(bstFromPreorder(preorder),res);
    //
    //    //根据前序遍历及中序遍历构建二叉树
    //    vector<int>preV{3,9,1,2,20,15,7};
    //    vector<int>inV{1,9,2,3,15,20,7};
    //    levelOrder(buildTreeFromPreIn(preV,inV),res);
    
    //    // 根据中序遍历及后序遍历构建二叉树
    //    vector<int>inV{9,3,15,20,7};
    //    vector<int>posV{9,15,7,20,3};
    //    levelOrder(buildTreeFromInPos(inV,posV),res);
    
        // 根据中序遍历及后序遍历构建二叉树
        vector<int>preV{1,2,4,5,3,6,7};
        vector<int>posV{4,5,2,6,7,3,1};
        levelOrder(buildTreeFromPrePos(preV,posV),res);
    
        v_print(res);
    #elifdef BST
    
        //Leecode270 closest binary search tree value
    //    TreeNode b0(4);
    //    TreeNode b1(2);
    //    TreeNode b2(5);
    //    TreeNode b3(1);
    //    TreeNode b4(3);
    //    b1.left = &b3;
    //    b1.right = &b4;
    //    b0.left = &b1;
    //    b0.right = &b2;
    //    cout << closestValue(&b0,3.714286) <<endl;
    
        //LeetCode450
    //    TreeNode b0(5);
    //    TreeNode b1(3);
    //    TreeNode b2(6);
    //    TreeNode b3(2);
    //    TreeNode b4(4);
    //    TreeNode b5(7);
    //    b1.left = &b3;
    //    b1.right = &b4;
    //    b0.left = &b1;
    //    b0.right = &b2;
    //    b2.right = &b5;
    //    pre(deleteNode(&b0,3));
    
    //    //LeetCode98
        TreeNode b0(1);
        TreeNode b1(2);
        TreeNode b2(3);
    //    b1.left = &b0;
    //    b1.right = &b2;
    //    cout << isValidBST(&b1) << endl;
    
    
    //    //LeetCode99
    //    b0.left = &b2;
    //    b2.right = &b1;
    ////    recover(&b0);
    //    recover2(&b0);
    //    pre(&b0);
    
         vector<vector<int>>res;
    
    //     //LeetCode108
    //     vector<int>nums{-10,-3,0,5,9};
    //     levelOrder(sortedArrayToBST(nums),res);
    
         //Leetcode1382
    //     TreeNode c0(1);
    //     TreeNode c1(2);
    //     TreeNode c2(3);
    //     TreeNode c3(4);
    //     c0.right = &c1;
    //     c1.right = &c2;
    //     c2.right = &c3;
    //     levelOrder(balanceBST(&c0),res);
    
         v_print(res);
    
         //LeetCode96
    //     cout << numTrees(3) << endl;
    
         //LeetCode95
    //     auto trees = generateTrees(3);
    //     for(auto tree:trees)
    //     {
    //         cout << "==" << endl;
    //         pre(tree);
    //         cout << "==" << endl;
    //     }
    
    #elifdef LCA
         //LeetCode235
         TreeNode c0(6);
         TreeNode c1(2);
         TreeNode c2(8);
         TreeNode c3(0);
         TreeNode c4(4);
         TreeNode c5(7);
         TreeNode c6(9);
         TreeNode c7(3);
         TreeNode c8(5);
         TreeNode p(2);
         TreeNode q(8);
         c0.left = &c1;
         c1.left = &c3;
         c1.right = &c4;
         c4.left = &c7;
         c4.right = &c8;
         c0.right = &c2;
         c2.left = &c5;
         c2.right = &c6;
         vector<vector<int>>res;
    
         //     levelOrder(&c0,res);
    //     cout << lowestCommonAncestor(&c0,&p,&q)->val_<<endl;
    //     cout << lowestCommonAncestor1(&c0,&p,&q)->val_<<endl;
    
         //LeetCode1644
    //     cout << lowestCommonAncestor2(&c0,&p,&q)->val_ << endl;
    
    
         //LeetCode1676
         vector<TreeNode*>nodes{&p,&q};
         cout << lowestCommonAncestor(&c0,nodes)->val_<<endl;
         v_print(res);
    
    #elifdef path
    //     TreeNode a0(1);
    //     TreeNode a1(2);
    //     TreeNode a2(3);
    //     TreeNode a3(5);
    //     a0.left = &a1;
    //     a0.right = &a2;
    //     a1.right = &a3;
    //     vector<string> strs = binaryTreePaths(&a0);
    //     for(auto & str : strs)
    //     {
    //         cout << str << endl;
    //     }
    //     LeetCode1448
    //       TreeNode a0(3);
    //       TreeNode a1(1);
    //       TreeNode a2(3);
    //       TreeNode a3(4);
    //       TreeNode a4(1);
    //       TreeNode a5(5);
    //       a0.left = &a1;
    //       a1.left = &a2;
    //       a0.right = &a3;
    //       a3.left = &a4;
    //       a3.right = &a5;
    //       cout << goodNodes(&a0) <<endl;
    
    //       LeetCode124
    //       TreeNode a0(-10);
    //       TreeNode a1(9);
    //       TreeNode a2(20);
    //       TreeNode a3(15);
    //       TreeNode a4(7);
    //       a0.left = &a1;
    //       a0.right = &a2;
    //       a2.left = &a3;
    //       a2.right = &a4;
    //       cout << maxSum(&a0)<<endl;
    
    
    //       LeetCode1120
    
    //       TreeNode a0(5);
    //       TreeNode a1(6);
    //       TreeNode a2(1);
    //       a0.left = &a1;
    //       a0.right = &a2;
    //       cout << maxAverageSubtree(&a0) <<endl;
    
    //       LeetCode1372
    //       TreeNode a0(1);
    //       TreeNode a1(1);
    //       TreeNode a2(1);
    //       TreeNode a3(1);
    //       TreeNode a4(1);
    //       TreeNode a5(1);
    //       TreeNode a6(1);
    //       TreeNode a7(1);
    //
    //       a0.right = &a1;
    //       a1.left = &a2;
    //       a1.right = &a3;
    //       a3.left = &a4;
    //       a3.right = &a5;
    //       a4.right =&a6;
    //       a6.right = &a7;
    //       cout << longestZigZag(&a0) << endl;
    
    //       LeetCode1123
    //       TreeNode a0(3);
    //       TreeNode a1(5);
    //       TreeNode a2(1);
    //       TreeNode a3(6);
    //       TreeNode a4(2);
    //       TreeNode a6(0);
    //       TreeNode a7(8);
    //       TreeNode a9(7);
    //       TreeNode a10(4);
    //       a0.left = &a1;
    //       a0.right = &a2;
    //       a1.left = &a3;
    //       a1.right = &a4;
    //       a4.left = &a9;
    //       a4.right = &a10;
    //       a2.left = &a6;
    //       a2.right = &a7;
    //       vector<vector<int>>res;
    //       levelOrder(lcaDeepestLeaves(&a0),res);
    //       v_print(res);
    
    //       LeetCode549
    
           TreeNode a0(2);
           TreeNode a1(1);
           TreeNode a2(3);
    
           a1.left = &a0;
           a1.right = &a2;
           cout << longestConsecutive(&a1) << endl;
    
           
    #endif
        return 0;
    }
  • 相关阅读:
    从电视剧《清平乐》聊聊宋仁宗和宋词
    也读《白鹿原》:望关中平原,窥民族秘史
    听说你在做数字化转型,了解中台一下不?
    刘润《商业洞察力30讲》学习总结
    《容器化.NET应用架构指南》脑图学习笔记(一)
    也聊春节:漫天红色与春晚变迁
    我的2019年终回顾:行道迟迟,载饥载渴,而立之年,持续刷新
    ASP.NET Core on K8S深入学习(11)K8S网络知多少
    ASP.NET Core on K8S深入学习(10)K8S包管理器Helm
    【译】gRPC vs HTTP APIs
  • 原文地址:https://www.cnblogs.com/fourmi/p/16157505.html
Copyright © 2020-2023  润新知