LeetCode-1305. 两棵二叉搜索树中的所有元素

给你 root1 和 root2 这两棵二叉搜索树。

请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.

示例 1:

输入:root1 = [2,1,4], root2 = [1,0,3]
输出:[0,1,1,2,3,4]
示例 2:

输入:root1 = [0,-10,10], root2 = [5,1,7,0,2]
输出:[-10,0,0,1,2,5,7,10]
示例 3:

输入:root1 = [], root2 = [5,1,7,0,2]
输出:[0,1,2,5,7]
示例 4:

输入:root1 = [0,-10,10], root2 = []
输出:[-10,0,10]
示例 5:

输入:root1 = [1,null,8], root2 = [8,1]
输出:[1,1,8,8]
 

提示:

每棵树最多有 5000 个节点。
每个节点的值在 [-10^5, 10^5] 之间。

非递归中序遍历 +  归并排序

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> getAllElements(TreeNode* root1, TreeNode* root2) {
        getMid(root1,leftTreeVal);
        getMid(root2,rightTreeVal);

        /* 两个数组,用栈进行排序 */
        vector<int> res;
        vector<int>::iterator r1 = leftTreeVal.begin();
        vector<int>::iterator r2 = rightTreeVal.begin();
        while(1){
            if(r1==leftTreeVal.end() || r2==rightTreeVal.end()){
                break;
            }
            if(*r1 <= *r2){
                res.push_back(*r1);
                r1++;
            }else{
                res.push_back(*r2);
                r2++;
            }
        }

        if(r1==leftTreeVal.end()){
            while(r2!=rightTreeVal.end()){
                res.push_back(*r2);
                r2++;
            }
        }

        else if(r2==rightTreeVal.end()){
            while(r1!=leftTreeVal.end()){
                res.push_back(*r1);
                r1++;
            }
        }

        return res;
    }

    void getMid(TreeNode *root, vector<int>& vec){
        TreeNode *mid = root;
        while(mid!=NULL || !m_stack.empty()){
            while(mid!=NULL){
                m_stack.push(mid);
                mid = mid->left;
            }
            if(!m_stack.empty()){
                mid = m_stack.top();
                vec.push_back(mid->val);
                mid = mid->right;
                m_stack.pop();
            }
        }
    }

private:
    stack<TreeNode *> m_stack;
    vector<int>leftTreeVal;
    vector<int>rightTreeVal;


};
int main(){
    TreeNode *root1 =new TreeNode(2);
    TreeNode *left1 = new TreeNode(1);
    TreeNode *right1 = new TreeNode(4);
    root1->left = left1;
    root1->right = right1;

    TreeNode *root2 =new TreeNode(1);
    TreeNode *left2 = new TreeNode(0);
    TreeNode *right2 = new TreeNode(3);
    root2->left = left2;
    root2->right = right2;

    Solution *ps = new Solution();

    vector<int>res = ps->getAllElements(root1,root2);
    for(int i=0;i<res.size();i++){
        cout<<res[i]<<endl;
    }

    return 0;
}
发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103833067