二叉排序树C++

二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键值;
若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键值;
左、右子树本身也是一颗二叉排序树。
现在给你 N 个关键字值各不相同的节点。要求你将这些节点按顺序插入一个初始为空树的二叉排序树中。每次成功插入一个节点后,求其相应的父亲节点的关键字值,如果没有父亲节点,则输出 −1。

输入格式
第一行包含整数 N,表示待插入的节点数。
第二行包含 N 个互不相同的正整数,表示要顺序插入节点的关键字值。

数据范围
1≤N≤100,
节点关键字值取值范围 [1,108]。

输入样例:
5
2 5 1 3 4

输出样例:
-1
2
2
5
3

数组模拟二叉树参考之前的帖子二叉树的插入

#include
#include
using namespace std;
const int N=110;
int w[N],l[N],r[N],fa[N],root,idx;
void insert(int &u,int x)
{
    if(!u) u=++idx,w[u]=x;
    else if(x<w[u]) insert(l[u],x);
    else if(x>w[u]) insert(r[u],x);
}
void dfs(int u)
{
    if(!u) return;
    fa[l[u]]=w[u]; 
    fa[r[u]]=w[u];
    dfs(l[u]);
    dfs(r[u]);
}
int main()
{
    int n;
    cin>>n;
    memset(fa,-1,sizeof fa);
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        insert(root,x);
    }
    dfs(root);
    for(int i=1;i<=n;i++) cout<<fa[i]<<endl;
    return 0;
}

l[i]存储的为左孩子的下标,r[i]存储的为右孩子的下标。
fa[i]存储的为第i个节点的父节点的下标。
w[i]存储的为第i个节点的值。
例如:当插入2 5 1 3 4时
w:2 5 1 3 4
l : 3 4 0 0 0
r : 2 0 0 5 0

你可能感兴趣的:(c++,算法,深度优先)