建立二叉搜索树

简介: 建立二叉搜索树
#include <stdio.h>
#include <stdlib.h>
typedef struct treenode{
  struct treenode *left;
  struct treenode *right;
  int v;
  int flag; 
}tree;
tree insert(tree t,int v){
  if(!t){
    t=newnode(v);
  }else{
    if(v>t->v){
      t->right=insert(t->right,v);
    }
    else{
      t->left=insert(t->left,v);
    }
  }
  return t;
} 
int check(tree t,int v){
  if(t->flag){
    if(v<t->v)return check(t->left,v);//如果当前访问完 则访问t的左子树 
    else if(v>t->v) return check(t->right,v);//访问右子树 
    else return 0;
  }else{
    if(v==t->v){
      t->flag=1;//表示访问完成 
      return 1; 
    }
    else{
      return 0;
    }
  }
}
int judge(tree t,int n){
  int i;v,flag=0;
  scanf("%d",&v);
  if(v!=t->v)flag=1;
  else t->flag=1;
  for(i=1;i<n;i++){
    scanf("%d",&v);
    if(!flag&&!check(t,v))flag=1;
  }
  if(flag)return 0;
  else return 1;
}
void reset(tree t){
  if(t->left)reset(t->left);
  if(t->right)reset(t->right);
  t->flag=0;
} 
void freetree(tree t){
  if(t->left)reset(t->left);
  if(t->right)reset(t->right);
  free(t);
} 
tree newnode(int V){
  tree t=(tree)malloc(sizeof(struct treenode));//创造节点并初始化  
  t->v=V;
  t->right=t->left=NULL;
  t->flag=0;//表示没被访问过为零 
  return t;
}
tree maketree(int n){
  tree t;
  int i,v;
  scanf("%d",&v);
  t=newnode(v);// 只有一个节点 
  for(i=0;i<n;i++){
    scanf("%d",v);
    t=insert(t,v);
  }
  return t;
}
int main(){
  int n,l,i;
  tree t;
  scanf("%d",&n);
  while(n){
    scaanf("%d",&l);
    t=maketree(n);
    for(i=0;i<l;i++){
      if(judge(t,n)){
        printf("yes\n");
      }
      else{
        printf("no\n");
      }
      resetT(t);
    }
    freetree(t);
    scanf("%d",&n);
  }
  return 0;
}
相关文章
|
存储 人工智能 C语言
二叉搜索树的建立
二叉搜索树最大特征是:左边子结点的值ivalue = value; pt->pleft = NULL; pt->pright = NULL; return ; } else if( value < pt->ivalue) ...
822 0
|
机器学习/深度学习 Windows
L2-026 小字辈(树的建立+BFS)
L2-026 小字辈(树的建立+BFS)
100 0
数据结构实验之二叉树的建立与遍历
数据结构实验之二叉树的建立与遍历
二叉树的建立(先中后序)
题目1078:二叉树遍历 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2013解决:1212 题目描述: 二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的
1311 0
|
4月前
|
存储 算法
单链表的建立
单链表的建立
30 0
|
存储 算法 Java
建立单链表相关问题详解
相信学习程序编程的各位猿友们对链表再熟悉不过了,这是我们在学数据结构时遇到的一种存储结构,在链表的问题上,并不是我们想的那样简单,当然,也不是那么难。对于初学者来说,未免是抽象而复杂的,我们常常以为,抽象的东西当当然需要去抽象的理解,我们常常看到书上这样写,抽象数据结构,那些定义的方式,常常让初学者有点懵懂。数据结构的东西很需要强大的逻辑思维去理解,算法的问题通常并不是很好去解决,逻辑思维其实并不是先天的,更重要的是我们在后天的学习过程中建立这种思维。就像我们脑子里常常建立的突触一样,多思考,多操作,你才能变得聪明。所以,对此我们应怀有信心和激情。
147 0
|
存储 算法
【算法导论】二叉树的建立
二叉树的建立 基本概念:         有序树与无序树:若将树中的每个节点的各个子树都看成是从左到右有次序的,则称该树为有序树,否则为无序数。
1286 0
数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立

热门文章

最新文章