建立二叉搜索树并查找父结点 C++语言

建立二叉搜索树并查找父结点
按输入顺序建立二叉搜索树,并搜索某一结点,输出其父结点。
输入格式:
输入有三行: 第一行是n值,表示有n个结点; 第二行有n个整数,分别代表n个结点的数据值; 第三行是x,表示要搜索值为x的结点的父结点。
输出格式:
输出值为x的结点的父结点的值。 若值为x的结点不存在,则输出:It does not exist. 若值为x的结点是根结点,则输出:It doesn't have parent.
输入样例:
2
20
30
20
输出样例:
It doesn't have parent.
输入样例:
2
20
30
30
输出样例:
20

 #include <iostream>

#include<stdio.h>

using namespace std;



const int size=10005;

int  T,N,first,second;       

vectorvec[size];   //用来记录图的信息

bool root[size];              //用来查找根节点

int depth[size];               //用来记录该节点的深度

int father[size];               //用来记录该节点的父节点



//录入数据

void In_data()

{

        scanf("%d",&N);

        for(int i=1;i<=N;++i)

        {

                vec[i].clear();

                depth[i]=0;

                root[i]=true;

                father[i]=i;

        }



        for(int i=1;i  

       {

                int beg,end;

                scanf("%d%d",&beg,&end);

                vec[beg].push_back(end);

                father[end]=beg;

                root[end]=false;

        }

        scanf("%d%d",&first,&second);

}



//parent表示根节点,dep表示当前节点的深度

void depth_plus(int parent,int dep)

{

        for(int i=0;i   {

                depth_plus(vec[parent][i],dep+1);

        }

        depth[parent]=dep;

}



//在线算法查找最近公共祖先

int find_ancestor()

{

        if(depth[first]>depth[second])

        {

                while(depth[first]!=depth[second])

                {

                        first=father[first];

                }

        }

        else if(depth[second]>depth[first])

        {

                while(depth[first]!=depth[second])

                {

                        second=father[second];

                }

        }



        while(first!=second)

        {

                first=father[first];

                second=father[second];

        }

        return first;

}



int main()

{

        //freopen("1.txt","r",stdin);

        scanf("%d",&T);

        while(T--)

        {

                In_data();

                //以根节点为入口,给每个点赋予深度

                for(int i=1;i<=N;++i)

                {

                        if(root[i]==true)

                        {

                                depth_plus(i,0);

                                break;

                        }

                }

                printf("%d\n",find_ancestor());

        }

}

解释都在代码里了QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1005;
struct BinaryTree{
    int val;
    int l;
    int r;
    BinaryTree(){val=0;l=r=-1;}
}tree[N];
int ar[N],n,tot,x;
bool flag;//是否找到父节点
int ans;//答案
//递归建树,k为当前建树已经跑到了输入序列数组的第几号元素
void build(int k){
    if(k>n)return;
    tree[++tot].val=ar[k];
    tree[tot].l=tree[tot].r=-1;
    int i=1;
    while(1){
        if(ar[k]>=tree[i].val){//如果不小于此节点值就往右边建树
            if(tree[i].r!=-1){
                i=tree[i].r;
            }else{
                tree[i].r=tot;
                break;
            }
        }else {
            if(tree[i].l!=-1){
                i=tree[i].l;
            }else{
                tree[i].l=tot;
                break;
            }
        }
    }
    build(k+1);
    return;
}
void Find(int k,int fa){
    if(flag)return;//已找到就回溯
    if(tree[k].val==x){
        flag=true;
        ans=fa;
        return;
    }
    if(tree[k].l!=-1){//如果有左儿子往左搜索
        Find(tree[k].l,tree[k].val);
        if(flag)return;
    }
    if(tree[k].r!=-1){//如果有右儿子往右搜索
        Find(tree[k].r,tree[k].val);
        if(flag)return;
    }
}
int main(){
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;++i){
            scanf("%d",&ar[i]);
        }
        tot=1;//节点编号
        tree[1].val=ar[1];//根节点
        tree[1].l=tree[1].r=-1;
        build(2);
        scanf("%d",&x);
        flag=0;ans=-1;
        Find(1,-1);//找x
        if(flag==false||ans==-1)printf("It doesn't have parent.\n");
        else printf("%d\n",ans );
    }
    return 0;
}