算法训练 二叉搜索树

算法训练 二叉搜索树
算法训练 二叉搜索树

#include<iostream>
#include<string>
#include<vector>
using namespace std;
const int N = 100005;
struct Node{
	int val, r, l;
};

Node t[N];
int root, cnt;//root根节点 cnt 二叉树大小
//sequence 给定的序列
int insert(int v,int x) { //v要插入的数字 x 根
	if (x == 0) {
		x = ++cnt;//大小先+1
		t[x].val = v;
		t[x].l = t[x].r = 0;
		return x;//初始化
	}
	if (v > t[x].val) {
		t[x].r = insert(v, t[x].r);//递归向右子树插入
	}
	else if (t[x].val > v) {
		t[x].l = insert(v, t[x].l);//递归向左子树插入
	}

	return x;//返回根节点,根节点不会再发生变化
}
void dlr(int x, vector<int>&ans) {//ans存储结果
	if (x) {  
		ans.push_back(t[x].val);
		dlr(t[x].l, ans);
		dlr(t[x].r, ans);
	}
}
void lrd(int x, vector<int>&ans) {//ans存储结果
	if (x) {
		
		lrd(t[x].l, ans);
		lrd(t[x].r, ans);
		ans.push_back(t[x].val);
	}
}


vector<int> getAnswer(int n, vector<int>sequence) {
	root = cnt = 0;
	for (int i = 0; i<int(sequence.size()); ++i) {
		root = insert(sequence[i], root);
	}
	vector<int>ans;
	dlr(root, ans);//前序遍历
	lrd(root, ans);//后序遍历
	return ans;
}
 
int main() {
	int n, x;
	cin>>n;
	vector<int> sequence;
	for (int i = 0; i < n; ++i) {
		cin>>x;
		sequence.push_back(x);
	}
	vector<int> ans = getAnswer(n, sequence);
	for (int i = 0; i < n; ++i)
		cout << ans[i]<<" ";
	cout << endl;
	for (int i = 0; i < n; ++i)
		cout << ans[i+n] << " ";
	return 0;
}