给你 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;
}