天梯赛 L3-016 二叉搜索树的结构 (30分)

天梯赛 L3-016 二叉搜索树的结构 (30分)

题解:

正常建立二叉搜索树即可,不过要注意数据中有负数的情况。
天梯赛 L3-016 二叉搜索树的结构 (30分)_第1张图片

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int n,m;
string s;

struct node{
    int key;
    node *parent,*left,*right;
    int depth;
};

node *root,*NIL,*t;

void insert_node(int k){
    node *x=root;
    node *y=NIL;
    node *z=(node *)malloc(sizeof(node));

    z->key=k;
    z->left=NIL;
    z->right=NIL;
    while(x!=NIL){
        y=x;
        if(z->key<x->key){
            x=x->left;
        }else{
            x=x->right;
        }
    }

    z->parent=y;
    if(y==NIL) root=z;
    else{
         if(z->key<y->key){
            y->left=z;
        }else{
            y->right=z;
        }
    }
}

void search_node(node* root,int k){
    if(root->key==k) t=root;
    if(root->left!=NIL&&k<root->key) search_node(root->left,k);
    if(root->right!=NIL&&k>root->key) search_node(root->right,k);
}

void dfs(node* root,int depth){
    root->depth=depth;
    if(root->left!=NIL) dfs(root->left,depth+1);
    if(root->right!=NIL) dfs(root->right,depth+1);
}

int main(){
    cin>>n;
    int tmp;
    for(int i=0;i<n;i++){
        cin>>tmp;
        insert_node(tmp);
    }
    dfs(root,0);//dfs求深度
    cin>>m;
    getchar();
    for(int i=0;i<m;i++){
        getline(cin,s);
        int len=s.length();
        int a,b,pos;
        if(s.find("left")!=s.npos){
            a=b=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[0]=='-') a=-a;
            for(int j=len-1;j>=0;j--){
                if(s[j]==' '||s[j]=='-') {pos=j;break;}
            }
            for(int j=pos+1;j<len;j++){
                b=b*10+s[j]-'0';
            }
            if(s[pos]=='-') b=-b;
            t=NIL;
            search_node(root,b);
            if(t!=NIL&&t->left!=NIL&&t->left->key==a) printf("Yes\n");
            else printf("No\n");
        }else if(s.find("right")!=s.npos){
            a=b=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[0]=='-') a=-a;
            for(int j=len-1;j>=0;j--){
                if(s[j]==' '||s[j]=='-') {pos=j;break;}
            }
            for(int j=pos+1;j<len;j++){
                b=b*10+s[j]-'0';
            }
            if(s[pos]=='-') b=-b;
            t=NIL;
            search_node(root,b);
            if(t!=NIL&&t->right!=NIL&&t->right->key==a) printf("Yes\n");
            else printf("No\n");
        }else if(s.find("root")!=s.npos){
            a=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[0]=='-') a=-a;
            if(a==root->key) printf("Yes\n");
            else printf("No\n");
        }else if(s.find("sib")!=s.npos){
            a=b=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else {pos=j;break;}
            }
            if(s[0]=='-') a=-a;
            for(int j=pos+5;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') b=b*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[pos+5]=='-') b=-b;
            t=NIL;
            search_node(root,a);
            node* t1=t;
            t=NIL;
            search_node(root,b);
            if(t1!=NIL&&t!=NIL&&t1->parent!=NIL&&t->parent!=NIL&&t1->parent==t->parent) printf("Yes\n");
            else printf("No\n");
        }else if(s.find("parent")!=s.npos){
            a=b=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[0]=='-') a=-a;
            for(int j=len-1;j>=0;j--){
                if(s[j]==' '||s[j]=='-') {pos=j;break;}
            }
            for(int j=pos+1;j<len;j++){
                b=b*10+s[j]-'0';
            }
            if(s[pos]=='-') b=-b;
            t=NIL;
            search_node(root,b);
            if(t!=NIL&&t->parent!=NIL&&t->parent->key==a) printf("Yes\n");
            else printf("No\n");
        }
        else if(s.find("same")!=s.npos){
            a=b=0;
            for(int j=0;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') a=a*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else {pos=j;break;}
            }
            if(s[0]=='-') a=-a;
            for(int j=pos+5;j<len;j++){
                if(s[j]>='0'&&s[j]<='9') b=b*10+s[j]-'0';
                else if(s[j]=='-') continue;
                else break;
            }
            if(s[pos+5]=='-') b=-b;
            t=NIL;
            search_node(root,a);
            node* t1=t;
            t=NIL;
            search_node(root,b);
            if(t1!=NIL&&t!=NIL&&t1->depth==t->depth) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

你可能感兴趣的:(树)