代码随想录-二叉树

#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <unordered_map>

using namespace std;

struct TreeNode
{
    int val = 0;
    TreeNode* left = nullptr;
    TreeNode* right = nullptr;
    TreeNode* next = nullptr;
    TreeNode(int val_):val(val_),left(nullptr),right(nullptr),next(nullptr) 
    {
        ;
    }
};

void print(const vector<vector<int>>& nums)
{
    for(auto vs:nums)
    {
        for(auto num : vs)
        {
            cout << num << " ";
        }
        cout << endl;
    }
}

template<typename T>
void print(const vector<T>nums)
{
    for(T num : nums)
    {
        cout << num << " "; 
    }
    cout << endl;
}

void pre(TreeNode* node, vector<int>& vec)
{
    if(nullptr == node)return;
    vec.push_back(node->val);
    pre(node->left,vec);
    pre(node->right,vec);
}

void in(TreeNode* node, vector<int>& vec)
{
    if(nullptr == node)return;    
    in(node->left,vec);
    vec.push_back(node->val);
    in(node->right,vec);
}

void post(TreeNode* node, vector<int>& vec)
{
    if(nullptr == node)return;    
    post(node->left,vec);
    post(node->right,vec);
    vec.push_back(node->val);
}

vector<int>pre(TreeNode* node)
{
    vector<int>res;
    if(nullptr == node)return res;
    stack<TreeNode*>st;
    st.push(node);
    while(!st.empty())
    {
        TreeNode* cur = st.top();
        st.pop();
        res.push_back(cur->val);
        if(cur->right)st.push(cur->right);
        if(cur->left)st.push(cur->left);
    }
    return res;
}

vector<int>in(TreeNode* node)
{
    vector<int>res;
    stack<TreeNode*>st;
    TreeNode* cur = node;
    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 res;

}

vector<int>post(TreeNode* node)
{
    vector<int>res;
    if(nullptr == node)return res;
    stack<TreeNode*>st;
    st.push(node);
    while(!st.empty())
    {
        TreeNode* cur = st.top();
        st.pop();
        res.push_back(cur->val);
        if(cur->left != nullptr)st.push(cur->left);
        if(cur->right != nullptr)st.push(cur->right);
    }
    reverse(res.begin(),res.end());
    return res;    
}

vector<int>visit(TreeNode* node)
{
    vector<int>res;
    pre(node,res);
    // res = pre(node);
    
    // in(node,res);
    // res = in(node);
    
    // post(node,res);
    // res = post(node);
    return res;
}

vector<vector<int>> levelOrder(TreeNode* node)
{
    vector<vector<int>>res;
    if(nullptr == node)return res;
    queue<TreeNode*>q;
    q.push(node);
    while (!q.empty())
    {
        int size = q.size();
        vector<int>v;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();            
            v.push_back(cur->val);
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }
        res.push_back(v);
    }
    return res;
    
}

vector<vector<int>>levelOrderII(TreeNode* node)
{
    vector<vector<int>>res;
    if(nullptr == node)return res;
    queue<TreeNode*>q;
    q.push(node);
    while(!q.empty())
    {
        int size = q.size();
        vector<int>v;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            v.push_back(cur->val);
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }
        res.push_back(v);
    }
    reverse(res.begin(),res.end());
    return res;
}

vector<int>rightSideView(TreeNode* node)
{
    vector<int>res;
    if(nullptr == node)return res;
    queue<TreeNode*>q;
    q.push(node);
    while(!q.empty())
    {
        int size = q.size();
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            if(i == size - 1)
            {
                res.push_back(cur->val);
            }
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }            
    }
    return res;
}

vector<double> averageofLevels(TreeNode* node)
{
    vector<double>res;
    if(nullptr == node)return res;
    queue<TreeNode*>q;
    q.push(node);
    while(!q.empty())
    {
        int size = q.size();
        double sum = 0.;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            sum += cur->val;
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }        
        res.push_back(sum / size);
    }    
    return res;
}

vector<int>largestVals(TreeNode* node)
{
    vector<int>res;
    if(nullptr == node)
    return res;
    queue<TreeNode*>q;
    q.push(node);
    while(!q.empty())
    {
        int size = q.size();
        int maxVal = INT_MIN;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            maxVal = max(maxVal,cur->val);
            if(cur->left)q.push(cur->left);
            if(cur->right)q.push(cur->right);            
        }
        res.push_back(maxVal);
    }
    return res;
}

TreeNode* connect(TreeNode* node)
{
    if(node == nullptr)return nullptr;
    queue<TreeNode*>q;    
    q.push(node);
    while(!q.empty()){
        TreeNode* cur,*preNode;
        int size = q.size();
        for(int i = 0; i < size; ++i)
        {
            if(0 == i)
            {
                preNode = q.front();
                q.pop();
                cur = preNode;
            }
            else
            {
                cur = q.front();
                q.pop();
                preNode->next = cur;
                preNode = preNode->next;
            }
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }
        cur->next=nullptr;
    }
    return node;
}

TreeNode* invertTree(TreeNode* node)
{
    if(nullptr == node)return nullptr;
    swap(node->left,node->right);
    invertTree(node->left);
    invertTree(node->right);
    return node;
}

TreeNode* dfs_invertTree(TreeNode* node)
{
    if(nullptr == node)return nullptr;
    stack<TreeNode*>st;
    st.push(node);
    while(!st.empty())
    {
        TreeNode* cur = st.top();
        st.pop();
        swap(cur->left,cur->right);
        if(cur->right != nullptr)st.push(cur->right);
        if(cur->left != nullptr)st.push(cur->left);
    } 
    return node;
}

TreeNode* bfs_invertTree(TreeNode* node)
{
    if(nullptr == node)return nullptr;
    queue<TreeNode*>q;
    q.push(node);
    while (!q.empty())
    {
        int size = q.size();
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            swap(cur->left,cur->right);
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }
    }
    return node;
    
}

bool compare(TreeNode* left, TreeNode* right)
{
    if(nullptr == left && nullptr != right)return false;
    else if(nullptr == right && nullptr != left)return false;
    else if(nullptr == left && nullptr == right)return true;
    else if(left->val != right->val)return false;
    bool outside = compare(left->left,right->right);
    bool inside = compare(left->right,right->left);
    return inside && outside;
    
}

bool isSymmetric(TreeNode* root)
{
    if(root == nullptr)return true;
    return compare(root->left,root->right);
}

bool isSymmetric_queue(TreeNode* root)
{
    if(root == nullptr)return true;
    queue<TreeNode*>q;
    q.push(root->left);
    q.push(root->right);
    while(!q.empty())
    {
        TreeNode* leftNode = q.front();q.pop();
        TreeNode* rightNode = q.front();q.pop();
        if(!leftNode && !rightNode)continue;
        if(!leftNode || !rightNode || (leftNode->val != rightNode->val))
        return false;
        q.push(leftNode->left);
        q.push(rightNode->right);
        q.push(leftNode->right);
        q.push(rightNode->left);
    }
    return true;
}

bool isSymmetric_stack(TreeNode* root)
{
    if(nullptr == root)return true;
    stack<TreeNode*>st;
    st.push(root->left);
    st.push(root->right);
    while(!st.empty())
    {
        TreeNode* leftNode = st.top();st.pop();
        TreeNode* rightNode = st.top();st.pop();
        if(!leftNode && !rightNode)continue;
        if(!leftNode || !rightNode || leftNode->val != rightNode->val)return false;
        st.push(leftNode->left);
        st.push(rightNode->right);
        st.push(leftNode->right);
        st.push(rightNode->left);
    }
    return true;
}

int getDepth(TreeNode* root)
{
    if(nullptr == root)
    return 0;
    int leftDepth = getDepth(root->left);
    int rightDepth = getDepth(root->right);
    return 1 + max(leftDepth,rightDepth);
}

int getDepth_q(TreeNode* root)
{
    if(nullptr == root)return 0;
    queue<TreeNode*>q;
    q.push(root);
    int depth = 0;
    while(!q.empty())
    {
        int size = q.size();
        ++depth;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();
            q.pop();
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
        }
        
    }
    return depth;
}

int getMinDepth(TreeNode* root)
{
    if(nullptr == root)return 0;
    int leftDepth = getMinDepth(root->left);
    int rightDepth = getMinDepth(root->right);
    if(root->left == nullptr && root->right!=nullptr)
    {
        return 1 + rightDepth;
    }
    if(root->right == nullptr && root->left != nullptr)
    {
        return 1 + leftDepth;
    }
    return 1 + min(leftDepth,rightDepth);
}

int getMinDepth_q(TreeNode* root)
{
    if(nullptr == root)return 0;
    queue<TreeNode*>q;
    q.push(root);
    int depth = 0;
    while(!q.empty())
    {
        int size = q.size();
        ++depth;
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur = q.front();q.pop();
            if(cur->left != nullptr)q.push(cur->left);
            if(cur->right != nullptr)q.push(cur->right);
            if(cur->left == nullptr && cur->right == nullptr)
            {
                return depth;
            }
        }
    }
    return depth;
}

int getCountNums(TreeNode* root)
{
    if(nullptr == root)return 0;
    int leftNums = getCountNums(root->left);
    int rightNums = getCountNums(root->right);
    return 1 + leftNums + rightNums;
}

int getCountNums_q(TreeNode* root)
{
    if(nullptr == root)return 0;
    queue<TreeNode*>q;
    q.push(root);
    int res = 0;
    while(!q.empty())
    {
        int size = q.size();
        for(int i = 0; i < size; ++i)
        {
            TreeNode* cur  = q.front();q.pop();
            ++res;
            if(cur->left)q.push(cur->left);
            if(cur->right)q.push(cur->right);            
        }
    }
    return res;
}

int getDepth_help(TreeNode* root)
{
    if(nullptr == root)return 0;
    int left = getDepth_help(root->left);
    if(left == -1)return -1;
    int right = getDepth_help(root->right);
    if(right == -1)return -1;
    return abs(left-right) > 1 ? -1 : 1 + max(left,right);
}

bool isBalance(TreeNode* root)
{
    return getDepth_help(root) == -1 ? false : true;
}

void travelsal(TreeNode* node,vector<int>& path,vector<string>& res)
{
    path.push_back(node->val);
    if(node->left==nullptr && node->right==nullptr)
    {
        string sPath = "";
        for(int i = 0; i < path.size() - 1; ++i)
        {
            sPath += to_string(path[i]);
            sPath += "->";
        }
        sPath += to_string(path[path.size() - 1]);
        res.emplace_back(sPath);
        return;
    }
    if(node->left)
    {
        travelsal(node->left,path,res);
        path.pop_back();
    }
    if(node->right)
    {
        travelsal(node->right,path,res);
        path.pop_back();
    }    
}

vector<string>binaryTreePath(TreeNode* root)
{
    vector<string>res;
    vector<int>path;
    travelsal(root,path,res);
    return res;

}

vector<string>binaryTreePaths(TreeNode* root)
{
    vector<string>res;
    if(root == nullptr)return res;
    stack<TreeNode*>st;
    stack<string>paths;
    st.push(root);
    paths.push(to_string(root->val));
    while(!st.empty())
    {
        TreeNode* cur = st.top();st.pop();
        string path = paths.top();paths.pop();
        if(cur->left == nullptr && cur->right == nullptr)res.emplace_back(path);
        if(cur->right)
        {
            st.push(cur->right);
            paths.push(path + "->" +to_string(cur->right->val));
        }
        if(cur->left)
        {
            st.push(cur->left);
            paths.push(path + "->"+to_string(cur->left->val));
        }
    }
    return res;
}

int sumOfLeftLeaves(TreeNode* root)
{
    if(nullptr == root)return 0;
    int leftSum = sumOfLeftLeaves(root->left);
    int rightSum = sumOfLeftLeaves(root->right);
    int midVal = 0;
    if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr)
    midVal = root->left->val;
    return midVal + leftSum + rightSum;
}

int sumOfLeftLeaves_st(TreeNode* root)
{
    if(nullptr == root)return 0;
    stack<TreeNode*>st;
    st.push(root);
    int res = 0;
    while(!st.empty())
    {
        TreeNode* cur = st.top();st.pop();
        if(cur->left != nullptr && cur->left->left == nullptr && cur->left->right == nullptr)
        {
            res += cur->left->val;
        }        
        if(cur->right)
        {
            st.push(cur->right);
        }
        if(cur->left)
        {
            st.push(cur->left);            
        }
    }
    return res;
}

int findBottomLeftVal(TreeNode* root)
{
    if(nullptr == root)return 0;
    queue<TreeNode*>q;
    int res = 0;
    q.push(root);
    while (!q.empty())
    {
        int size = q.size();
        for(int i = 0 ; i < size; ++i)
        {
            TreeNode* cur = q.front();q.pop();
            if(0 == i)res = cur->val;
            if(cur->left)q.push(cur->left);
            if(cur->right)q.push(cur->right);
        }
    }
    return res;
    
}

bool traversal(TreeNode* root, int target)
{
    if(root->left == nullptr && root->right == nullptr && target == 0)return true;
    if(root->left == nullptr && root->right == nullptr)return false;
    if(root->left)
    {
        target -= root->left->val;
        if(traversal(root->left,target))return true;
        target += root->left->val;
    }
    if(root->right)
    {
        target -= root->right->val;
        if(traversal(root->right,target))return true;
        target += root->right->val;
    }
    return false;
}

bool hasPathSum(TreeNode* root,int target)
{
    if(nullptr == root)
    return false;
    return traversal(root,target - root->val);
}

bool hasPathSum_st(TreeNode* root, int target)
{
    if(nullptr == root)return false;
    stack<pair<TreeNode*,int>>st;
    st.push({root,root->val});
    while(!st.empty())
    {
        auto node = st.top();st.pop();
        if(!node.first->left && !node.first->right && node.second == target)return true;
        if(node.first->right != nullptr)
        {
            st.push({node.first->right,node.second + node.first->right->val});
        }
        if(node.first->left != nullptr)
        {
            st.push({node.first->left,node.second + node.first->left->val});
        }
    }
    return false;
}

void travelsal(TreeNode* root,vector<int>& path,vector<vector<int>>& res,int target)
{    
    if(root->left == nullptr && root->right == nullptr && target == 0)
    {
        res.push_back(path);        
        return;
    }
    if(root->left == nullptr && root->right == nullptr)
    {
        return ;
    }
    if(root->left)
    {
        path.push_back(root->left->val);
        target -= root->left->val;
        travelsal(root->left,path,res,target);
        target += root->left->val;
        path.pop_back();
    }
    if(root->right)
    {
        path.push_back(root->right->val);
        target -= root->right->val;
        travelsal(root->right,path,res,target);
        target += root->right->val;
        path.pop_back();
    }    
    return ;
}

vector<vector<int>>pathSum(TreeNode* root,int target)
{
    vector<vector<int>>res;
    if(nullptr == root)return res;
    vector<int>path;
    path.push_back(root->val);
    travelsal(root,path,res,target - root->val);        
    return res;
}

TreeNode* build(vector<int>&inorder,vector<int>&postorder)
{
    if(postorder.size() == 0)return nullptr;
    int rootVal = postorder[postorder.size() - 1];
    TreeNode* root = new TreeNode(rootVal);
    if(postorder.size() == 1)return root;
    int index = 0;
    for(; index < inorder.size(); ++index)
    {
        if(inorder[index] == rootVal)
        {
            break;
        }
    }
    vector<int>leftInorder{inorder.begin(),inorder.begin() + index};
    vector<int>rightInorder{inorder.begin() + index + 1,inorder.end()};
    postorder.resize(postorder.size() - 1);
    vector<int>leftPostorder{postorder.begin(),postorder.begin() + leftInorder.size()};
    vector<int>rightPostorder{postorder.begin() + leftInorder.size(),postorder.end()};
    root->left = build(leftInorder,leftPostorder);
    root->right = build(rightInorder,rightPostorder);
    return root;    
}

TreeNode* buildTreeNode(vector<int>&inorder,vector<int>&postorder)
{
    if(inorder.size() == 0 || postorder.size() == 0)return nullptr;
    return build(inorder,postorder);
}

TreeNode* build(vector<int>&preorder,int preBeg,int preEnd,vector<int>&inorder,int inBeg,int inEnd)
{
    if(preBeg == preEnd)return nullptr;
    int rootVal = preorder[preBeg];
    TreeNode* root = new TreeNode(rootVal);
    if(preEnd - preBeg == 1) return root;
    int index = 0;
    for(index = inBeg; index < inEnd; ++ index)
    {
        if(inorder[index] == rootVal)
        {
            break;
        }
    }
    
    int leftInorderBeg = inBeg;
    int leftInorderEnd = index;
    int rightInorderBeg = index + 1;
    int rightInorderEnd = inEnd;

    int leftPreorderBeg = preBeg + 1;
    int leftPreorderEnd = preBeg + 1 + index - inBeg;
    int rightPreorderBeg = preBeg + 1 + index - inBeg;
    int rightPreorderEnd = preEnd;
    root->left = build(preorder,leftPreorderBeg,leftPreorderEnd,inorder,leftInorderBeg,leftInorderEnd);    
    root->right = build(preorder,rightPreorderBeg,rightInorderEnd,inorder,rightInorderBeg,rightInorderEnd);
    return root;
}

TreeNode* buildTreeNodeII(vector<int>&preorder,vector<int>&inorder)
{
    if(preorder.size() == 0 || inorder.size() == 0)
    {
        return nullptr;
    }    
    return build(preorder,0,preorder.size(),inorder,0,inorder.size());
}

TreeNode* constructMaxBinaryTree(const vector<int>& nums)
{
    TreeNode* node = new TreeNode(0);
    if(nums.size() == 1)
    {
        node->val = nums[0];
        return node;
    }
    int maxIndex = 0;
    int maxVal = *max_element(nums.begin(),nums.end());
    for(int i = 0; i < nums.size(); ++i)
    {
        if(nums[i] == maxVal)
        {
            maxIndex = i;
            break;
        }
    }
    node->val = maxVal;
    if(maxIndex > 0)
    {
        vector<int>vecN{nums.begin(),nums.begin() + maxIndex};
        node->left = constructMaxBinaryTree(vecN);
    }
    if(maxIndex < nums.size() - 1)
    {
        vector<int>vecN{nums.begin()+maxIndex+1,nums.end()};
        node->right = constructMaxBinaryTree(vecN);
    }
    return node;
}

TreeNode* mergeTree(TreeNode* t1, TreeNode* t2)
{
    if(nullptr == t1)return t2;
    if(nullptr == t2)return t1;
    t1->val += t2->val;
    t1->left = mergeTree(t1->left,t2->left);
    t1->right = mergeTree(t1->right,t2->right);
    return t1;

}

TreeNode* mergeTree_q(TreeNode* t1, TreeNode* t2)
{
    if(nullptr == t1)return t2;
    if(nullptr == t2)return t1;
    queue<TreeNode*>q;
    q.push(t1);
    q.push(t2);
    while(!q.empty())
    {
        TreeNode* n1 = q.front();q.pop();
        TreeNode* n2 = q.front();q.pop();
        n1->val += n2->val;
        if(n1->left != nullptr && n2->left != nullptr)
        {
            q.push(n1->left);
            q.push(n2->left);
        }
        if(n1->right != nullptr && n2->right != nullptr)
        {
            q.push(n1->right);
            q.push(n2->right);
        }
        if(n1->left == nullptr && n2->left != nullptr)
        {
            n1->left = n2->left;
        }
        if(n1->right == nullptr && n2->right != nullptr)
        {
            n1->right = n2->right;
        }        
    } 
    return t1;
}

TreeNode* searchBST(TreeNode* root, int val)
{
    if(nullptr == root || root->val == val)return root;
    if(root->val > val)return searchBST(root->left,val);
    if(root->val < val)return searchBST(root->right,val);
    return nullptr;        
}

TreeNode* searchBST_iter(TreeNode* root,int val)
{
    while(root!=nullptr)
    {
        if(root->val > val)root = root->left;
        else if(root->val < val) root = root->right;
        else return root;
    }
    return nullptr; 
}

int maxV = INT_MIN;
bool isValidBST(TreeNode* root)
{
    if(nullptr == root)return true;
    bool left = isValidBST(root->left);
    if(maxV < root->val) maxV = root->val;
    bool right = isValidBST(root->right);
    return left && right;
}

bool isValidBST_st(TreeNode* root)
{
    stack<TreeNode*>st;
    TreeNode* pre = nullptr;
    TreeNode* cur = root;
    while(cur != nullptr || !st.empty())
    {
        if(cur != nullptr)
        {
            st.push(cur);
            cur = cur->left;
        }
        else
        {
            cur = st.top();st.pop();
            if(pre != nullptr && pre->val >= cur->val)return false;
            pre = cur;
            cur = cur->right;
        }
    }
    return true;
}

void minTravelsal(TreeNode* node,TreeNode* pre,vector<int>&res)
{
    if(nullptr == node)return;
    minTravelsal(node->left,pre,res);
    if(pre != nullptr)
    {
        res[0] = min(res[0],node->val - pre->val);
    }
    pre = node;
    minTravelsal(node->right,pre,res);

}

int getMinDiff(TreeNode* node)
{
    vector<int>res{INT_MAX};
    minTravelsal(node,nullptr,res);
    return res[0];
}

int getMinDiff_st(TreeNode* node)
{
    if(nullptr == node)return 0;
    stack<TreeNode*>st;
    TreeNode* cur = node;
    TreeNode* pre = nullptr;
    int res = INT_MAX;
    while(cur != nullptr || !st.empty())
    {
        if(cur != nullptr)
        {
            st.push(cur);
            cur = cur->left;
        }
        else
        {
            cur = st.top();st.pop();
            if(pre != nullptr)res = min(res,cur->val - pre->val);
            pre = cur;
            cur = cur->right;
        }
    }
    return res;
}

void travelsal(TreeNode* node, unordered_map<int,int>& map)
{
    if(nullptr == node)return ;
    ++map[node->val];
    travelsal(node->left,map);
    travelsal(node->right,map);

}

vector<int>findMode(TreeNode* node)
{
    vector<int>res;
    if(nullptr == node)return res;
    unordered_map<int,int>map;
    travelsal(node,map);
    vector<pair<int,int>>v{map.begin(),map.end()};
    sort(v.begin(),v.end(),[](const pair<int,int>&a,const pair<int,int>&b){return a.second > b.second;});
    res.push_back(v[0].first);
    for(int i = 1; i < v.size(); ++i)
    {
        if(v[i].second == v[0].second)
        {
            res.push_back(v[i].first);
        }
    }    
    return res;
}

vector<int>findMode_st(TreeNode* node)
{
    stack<TreeNode*>st;
    TreeNode* cur = node;
    TreeNode* pre = nullptr;
    vector<int>res;
    int cnt = 0, maxCnt = INT_MIN;
    while(cur != nullptr || !st.empty())
    {
        if(cur != nullptr)
        {
            st.push(cur);
            cur = cur->left;
        }
        else
        {
            cur = st.top();st.pop();
            if(pre == nullptr)cnt = 1;
            else if(pre->val == cur->val)++cnt;
            else cnt = 1;
            if(cnt == maxCnt)
            {
                res.push_back(cur->val);                
            }
            if(cnt > maxCnt)
            {
                maxCnt = cnt;
                res.clear();
                res.push_back(cur->val);
            }
            pre = cur;
            cur = cur->right;
        }
        
    }
    return res;    
}

TreeNode* lowestCommonTree(TreeNode* node,TreeNode* p, TreeNode* q)
{
    if(node == nullptr || node == p || node == q)return node;
    TreeNode* left = lowestCommonTree(node->left,p,q);
    TreeNode* right = lowestCommonTree(node->right,p,q);
    if(left != nullptr && right != nullptr)return node;
    else if(left != nullptr && right == nullptr)return left;
    else if(left == nullptr && right != nullptr )return right;
    else return nullptr;
}

TreeNode* lowestCommonTreeII(TreeNode* node,TreeNode* p, TreeNode* q)
{
    if(node == nullptr || node == p || node == q)return node;
    if(node->val > p->val && node->val > q->val)
    {
        TreeNode* left = lowestCommonTreeII(node->left,p,q);
        if(left != nullptr)return left;
    }    
    if(node->val < p->val && node->val < q->val)
    {
        TreeNode* right = lowestCommonTreeII(node->right,p,q);
        if(right != nullptr)return right;
    }    
    return node;
}

TreeNode* lowestCommonTreeII_iter(TreeNode* node,TreeNode* p, TreeNode* q)
{
    if(node == nullptr || node == p || node == q)return node;
    while(node)
    {
        if(node->val > p->val && node->val >q->val)
        {
            node = node->left;
        }
        else if(node->val < p->val && node->val < q->val)
        {
            node = node->right;
        }
        else 
        return node;
    }
    return nullptr;    
}

TreeNode* insertIntoBST(TreeNode* root, int val)
{
    if(nullptr == root){
        TreeNode* node = new TreeNode(val);
        return node;
    }
    root->left = insertIntoBST(root->left,val);
    root->right = insertIntoBST(root->right,val);
    return root;
}

TreeNode* insertIntoBST_iter(TreeNode* root,int val)
{
    if(nullptr == root)
    {
        TreeNode* node = new TreeNode(val);
        return node;
    }
    TreeNode* cur = root;
    TreeNode* pre = nullptr;
    while(cur != nullptr)
    {
        pre = cur ;
        if(cur->val > val)cur = cur->left;
        else cur = cur->right;
    }
    TreeNode* node = new TreeNode(val);
    if(val < pre->val)pre->left = node;
    else pre->right = node;
    return root;
}

TreeNode* deleteNode(TreeNode* root, int key)
{
    if(nullptr == root)return root;
    if(root->val == key)
    {
        if(root->left == nullptr) return root->right;
        else if(root->right == nullptr) return root->left;
        else
        {
            TreeNode* cur = root->right;
            while (cur->left != nullptr)            
            {
                cur = cur->left;
            }
            cur->left = root->left;
            TreeNode* tmp = root;
            cur->left = tmp;
            root = root->right;
            delete tmp;
            return root;            
        }
    }
    if(root->val > key)root->left = deleteNode(root->left,key);
    if(root->val < key)root->right = deleteNode(root->right,key);
    return root;
}

TreeNode* deleteOneNode(TreeNode* target)
{
    if(nullptr == target)return target;
    if(target->right == nullptr)return target->left;
    TreeNode* cur = target->right;
    while(cur->left)
    {
        cur = cur->left;
    }
    cur->left = target->left;
    return target->right;
}

TreeNode* deleteNode_iter(TreeNode* root,int key)
{
    if(nullptr == root)return root;
    TreeNode* cur = root;
    TreeNode* pre = nullptr;
    while(cur)
    {
        if(cur->val == key)break;
        pre = cur;
        if(cur->val > key)cur = cur->left;
        else cur = cur->right;
    }
    if(nullptr == pre)
    {
        return deleteOneNode(cur);
    }
    if(pre->left && pre->left->val == key)
    {
        pre->left = deleteOneNode(cur);
    }
    if(pre->right && pre->right->val ==key)
    {
        pre->right = deleteOneNode(cur);
    }
    return root;
}

TreeNode* trimTree(TreeNode* root, int low ,int high)
{
    if(nullptr == root)return nullptr;
    if(root->val < low)
    {
        TreeNode* right = trimTree(root->right,low,high);
        return right;
    }
    
    if(root->val > high)
    {
        TreeNode* left = trimTree(root->left,low,high);
        return left;
    }
    root->left = trimTree(root->left,low,high);
    root->right = trimTree(root->right,low,high);
    return root;
}

TreeNode* trimTreeNode_iter(TreeNode* root,int L ,int H)
{
    if(nullptr == root)return nullptr;
    if(root->val < L || root->val > H)
    {
        if(root->val < L)root = root->right;
        else root = root->left;
    }
    TreeNode* cur = root;
    while(cur != nullptr)
    {
        while(cur->left != nullptr && cur->left->val < L)
        {
            cur->left = cur->left->right;
        }
        cur = cur->left;
    }
    cur = root;
    while(cur != nullptr)
    {
        while(cur->right != nullptr && cur->right->val > H)
        {
            cur->right = cur->right->left;
        }
        cur = cur->right;
    }
    return root;
}

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

TreeNode* sortedAtoBST(const vector<int>& nums)
{
    return travel(nums,0,nums.size() - 1);
}

TreeNode* sortedAtoBST_q(const vector<int>& nums)
{
    if(nums.size() == 0)return nullptr;
    TreeNode* root = new TreeNode(0);
    queue<TreeNode*>q;
    queue<int>leftq,rightq;
    q.push(root);
    leftq.push(0);
    rightq.push(nums.size() - 1);
    while(!q.empty())
    {
        TreeNode* cur = q.front();q.pop();
        int left = leftq.front();leftq.pop();
        int right = rightq.front();rightq.pop();
        int mid = left + (right - left) / 2;
        cur->val = nums[mid];
        if(left <= mid - 1)
        {
            cur->left = new TreeNode(0);
            q.push(cur->left);
            leftq.push(left);
            rightq.push(mid - 1);
        }
        if(right >= mid  + 1)
        {
            cur->right = new TreeNode(0);
            q.push(cur->right);
            leftq.push(mid + 1);
            rightq.push(right);
        }
    }
    return root;
}

int preVal = 0;

void transvel(TreeNode* root)
{
    if(nullptr == root)return;
    transvel(root->right);
    root->val += preVal;
    preVal = root->val;
    transvel(root->left);
}

void transvel_st(TreeNode* root)
{
    if(nullptr == root)return;
    stack<TreeNode*>st;
    TreeNode* cur = root;
    while(cur != nullptr || !st.empty())
    {
        if(cur != nullptr)
        {
            st.push(cur);
            cur = cur->right;
        }
        else
        {
            cur = st.top();st.pop();
            cur->val += preVal;
            preVal = cur->val;
            cur = cur->left;
        }
    }
}

TreeNode* convertBST(TreeNode* root)
{
    preVal = 0;
    // transvel(root);
    transvel_st(root);
    return root;
}


int main()
{
    //二叉树的三种遍历
    TreeNode t0(0);
    TreeNode t1(1);
    TreeNode t2(2);
    TreeNode t3(3);
    t0.left = &t1;
    t0.right = &t2;
    t2.right = &t3;
    vector<int>vec;
    print(visit(&t0));
    
    //二叉树的层序遍历
    print(levelOrder(&t0));

    //LeetCode107二叉树的层次遍历II
    print(levelOrderII(&t0));

    //LeetCode199二叉树的右视图
    print(rightSideView(&t0));

    //LeetCode637 二叉树的层平均值
    print<double>(averageofLevels(&t0));

    //LeetCode515 二叉树的层最大值
    print<int>(largestVals(&t0));

    //LeetCode116 填充每一个节点的下一个节点
    print(visit(connect(&t0)));

    //LeetCode117 填充每一个节点的下一个节点II
    //同LeetCode116

    //LeetCode226 翻转二叉树
    print(levelOrder(&t0));
    cout << "====" << endl;    
    print(levelOrder(invertTree(&t0)));
    print(levelOrder(dfs_invertTree(&t0)));
    cout << "====" << endl;    
    print(levelOrder(bfs_invertTree(&t0)));

    //LeetCode101对称二叉树
    TreeNode n0(1);
    TreeNode n1(2);
    TreeNode n2(2);
    TreeNode n3(3);
    TreeNode n4(4);
    TreeNode n5(3);
    TreeNode n6(4);
    n0.left = &n1;
    n0.right = &n2;
    n1.left = &n3;
    n1.right = &n4;
    n2.left = &n6;
    n2.right = &n5;
    print(levelOrder(&n0));
    cout << isSymmetric(&n0) << endl;
    cout << isSymmetric_queue(&n0) << endl;
    cout << isSymmetric_stack(&n0) << endl;

    //LeetCode104 二叉树的最大深度
    cout << getDepth(&n0) << endl;
    cout << getDepth_q(&n0) << endl;

    //LeetCode111 二叉树的最小深度
    cout << getMinDepth(&t0) << endl;
    cout << getMinDepth_q(&t0) << endl;

    //LeetCode222 二叉树的节点个数
    cout << getCountNums(&n0) << endl;
    cout << getCountNums_q(&n0) << endl;

    //LeetCode110 平衡二叉树
    cout << isBalance(&n0) <<endl;

    //LeetCode257 二叉树的所有路径    
    print<string>(binaryTreePath(&t0));
    print<string>(binaryTreePaths(&t0));

    //LeetCode404 左叶子之和
    cout << sumOfLeftLeaves(&t0) << endl;
    cout << sumOfLeftLeaves_st(&t0) << endl;
    
    
    //LeetCode513 树左下角的值    
    cout << findBottomLeftVal(&n0) << endl;

    //LeetCode112 路径总和
    print(levelOrder(&n0));
    cout << hasPathSum(&n0,1) << endl;
    cout << hasPathSum_st(&n0,7) << endl;

    //LeetCode113 路径总和II
    print(pathSum(&n0,6));

    //LeetCode106 从中序与后序遍历序列构造二叉树
    vector<int>inorder{9,3,15,20,7};
    vector<int>postorder{9,15,7,20,3};    
    print(levelOrder(buildTreeNode(inorder,postorder))); 

    //LeetCode105 从前序与中序遍历构造二叉树
    vector<int>preorder{3,9,20,15,7};
    print(levelOrder(buildTreeNodeII(preorder,inorder)));

    //LeetCode654 构造一棵最大的二叉树
    vector<int>nums{3,2,1,6,0,5};    
    print(levelOrder(constructMaxBinaryTree(nums)));

    //LeetCode617 合并二叉树
    TreeNode tr0(1);
    TreeNode tr1(3);
    TreeNode tr2(2);
    TreeNode tr3(5);
    TreeNode tl0(2);
    TreeNode tl1(1);
    TreeNode tl2(3);
    TreeNode tl3(4);
    TreeNode tl4(7);
    tr0.left = &tr1;
    tr0.right = &tr2;
    tr1.left = &tr3;

    tl0.left = &tl1;
    tl0.right = &tl2;
    tl1.right = &tl3;
    tl2.right = &tl4;
    print(levelOrder(&tr0));
    print(levelOrder(&tl0));
    // print(levelOrder(mergeTree(&tr0,&tl0)));
    // print(levelOrder(mergeTree_q(&tr0,&tl0)));

    //LeetCode700 二叉搜索树中的搜索
    print(levelOrder(searchBST(&tl0,3)));
    print(levelOrder(searchBST_iter(&tl0,3)));

    //LeetCode98 验证二叉搜索🌲
    TreeNode b0(0);
    TreeNode b1(1);
    TreeNode b2(2);
    TreeNode b3(3);
    b2.left = &b1;
    b2.right = &b3;
    b1.left = &b0;
    cout << isValidBST(&b2) << endl;
    cout << isValidBST_st(&b2) << endl;

    //LeetCode530 二叉树的最小绝对差
    TreeNode tt0(1);
    TreeNode tt1(2);
    TreeNode tt2(3);
    tt0.right = &tt2;
    tt2.left = &tt1;
    cout << "=====" << endl;
    cout <<getMinDiff(&tt0)<< endl;
    cout << getMinDiff_st(&tt0) << endl;

    //LeetCode501 二叉搜索树中的众数
    cout << "=====" << endl;
    TreeNode t10(1);
    TreeNode t11(2);
    TreeNode t12(2);
    t10.left = &t11;
    t10.right = &t12;
    print<int>(findMode(&t10));
    print<int>(findMode_st(&t10));

    //LeetCode236 二叉树的公共祖先
    cout << lowestCommonTree(&t10,&t11,&t12)->val << endl;

    //LeetCode235 二叉搜索树的最近公共祖先
    cout << lowestCommonTreeII(&b2,&b1,&b3)->val << endl;
    cout << lowestCommonTreeII_iter(&b2,&b1,&b3)->val << endl;

    //LeetCode701 二叉搜索树中的插入操作
    cout << "=====" << endl;
    // print(levelOrder(insertIntoBST(&b2,4)));
    // print(levelOrder(insertIntoBST_iter(&b2,4)));

    //LeetCode450 删除二叉搜索树中的节点
    cout << "=====0" << endl;
    print(levelOrder(&b2));
    cout << "=====" << endl;
    // print(levelOrder(deleteNode(&b2,1)));
    print(levelOrder(deleteNode_iter(&b2,1)));

    //LeetCode669 修剪二叉搜索树 
    TreeNode t20(0);
    TreeNode t21(1);
    TreeNode t22(2);
    t21.left = &t20;
    t21.right = &t22;
    cout << "=====" << endl;
    // print(levelOrder(trimTree(&t21,1,2)));
    print(levelOrder(trimTreeNode_iter(&t21,1,2)));

    //LeetCode108 构造一棵二叉搜索树
    nums = {-10,-3,0,5,9};
    print(levelOrder(sortedAtoBST(nums)));
    print(levelOrder(sortedAtoBST_q(nums)));

    //LeetCode538 把二叉搜索树转化为累加树
    cout << "=====" << endl;
    print(levelOrder(&b2));
    print(levelOrder(convertBST(&b2)));

    return 0;
}

 

posted @ 2022-05-18 20:20  fourmii  阅读(29)  评论(0编辑  收藏  举报