Acwing 3540.二叉搜索树(指针+前中后序遍历)()

https://www.acwing.com/problem/content/description/3543/

输入一系列整数,利用所给数据建立一个二叉搜索树,并输出其前序、中序和后序遍历序列。

输入格式
第一行一个整数 n,表示输入整数数量。

第二行包含 n 个整数。

输出格式
共三行,第一行输出前序遍历序列,第二行输出中序遍历序列,第三行输出后序遍历序列。

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

数据范围
1≤n≤100,
输入元素取值范围 [1,1000]。

输入样例:
5
1 6 5 9 8
输出样例:
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1
#include<bits/stdc++.h>
using namespace std;
int n;
typedef unsigned long long ULL;
typedef long long LL;
typedef long double LD;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef struct node
{
    node *l,*r;//左右子树
    int val;//自己的权值
}*Node;
Node add(int x)
{
    Node tmp=new node;//建立新指针
    tmp->val=x;//初始化权值
    tmp->l=tmp->r=nullptr;//初始化左右子树
    return tmp;
}
Node insert(Node root,int x)//插入操作
{
    if(!root) return add(x);//在最底部的时候,直接新增节点
    if(x>root->val) root->r=insert(root->r,x);//如果大于根节点,就往右子树靠近
    else if(x<root->val) root->l=insert(root->l,x);//如果小于根节点,就往左子树靠近
    return root;
}
void pre(Node root)//前序遍历
{
    if(!root) return ;//到底了
    printf("%d ",root->val);//先输出根节点
    pre(root->l);//左子树
    pre(root->r);//右子树
}
void in(Node root)
{
    if(!root) return ;
    in(root->l);//左
    printf("%d ",root->val);//根
    in(root->r);//右
}
void post(Node root)
{
    if(!root) return ;
    post(root->l);
    post(root->r);
    printf("%d ",root->val);
}
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    Node root=nullptr;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        root=insert(root,x);//沿着根节点插入
    }
    pre(root);//前序遍历
    cout<<endl;
    in(root);//中序遍历
    cout<<endl;
    post(root);//后序遍历
    cout<<endl;
    return 0;
}
————————

https://www.acwing.com/problem/content/description/3543/

输入一系列整数,利用所给数据建立一个二叉搜索树,并输出其前序、中序和后序遍历序列。

输入格式
第一行一个整数 n,表示输入整数数量。

第二行包含 n 个整数。

输出格式
共三行,第一行输出前序遍历序列,第二行输出中序遍历序列,第三行输出后序遍历序列。

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

数据范围
1≤n≤100,
输入元素取值范围 [1,1000]。

输入样例:
5
1 6 5 9 8
输出样例:
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1
#include<bits/stdc++.h>
using namespace std;
int n;
typedef unsigned long long ULL;
typedef long long LL;
typedef long double LD;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef struct node
{
    node *l,*r;//左右子树
    int val;//自己的权值
}*Node;
Node add(int x)
{
    Node tmp=new node;//建立新指针
    tmp->val=x;//初始化权值
    tmp->l=tmp->r=nullptr;//初始化左右子树
    return tmp;
}
Node insert(Node root,int x)//插入操作
{
    if(!root) return add(x);//在最底部的时候,直接新增节点
    if(x>root->val) root->r=insert(root->r,x);//如果大于根节点,就往右子树靠近
    else if(x<root->val) root->l=insert(root->l,x);//如果小于根节点,就往左子树靠近
    return root;
}
void pre(Node root)//前序遍历
{
    if(!root) return ;//到底了
    printf("%d ",root->val);//先输出根节点
    pre(root->l);//左子树
    pre(root->r);//右子树
}
void in(Node root)
{
    if(!root) return ;
    in(root->l);//左
    printf("%d ",root->val);//根
    in(root->r);//右
}
void post(Node root)
{
    if(!root) return ;
    post(root->l);
    post(root->r);
    printf("%d ",root->val);
}
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    Node root=nullptr;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        root=insert(root,x);//沿着根节点插入
    }
    pre(root);//前序遍历
    cout<<endl;
    in(root);//中序遍历
    cout<<endl;
    post(root);//后序遍历
    cout<<endl;
    return 0;
}