数据结构之二叉树查找

数据结构之--二叉树查找

定义:它是一棵树,或者具有以下性质的树。

       若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

         若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

       它的左、右子树也分别为二叉排序树;

图解

    ​        ​    ​    ​    ​    ​​

#include<stdio.h>

#include<stdlib.h>

typedef int Status;

#define TRUE 1

#define FALSE 0

typedef struct BiTNode{                                /*节点结构*/

  int data;                                            

  struct BiTNode *lchild,*rchild;               /*节点数据*/  

}BiTNode,*BiTree;                                           /*左右孩子指针*/

 

/*中序遍历二叉树*/

void InOrderTraverse(BiTree T){

  if(T==NULL)

    return;

  InOrderTraverse(T->lchild);

  printf("%d ",T->data);

  InOrderTraverse(T->rchild);

}

 

/*二叉树查找*/

Status SearchBST(BiTree T,int key,BiTree f,BiTree *p){

  if(!T){                                                          /*查找不成功*/

    *p = f;

    return FALSE;

  }

  else if(key==T->data){                                  /*查找成功*/

    *p = T;

    return TRUE;

  }

  else if(key<T->data)

    return SearchBST(T->lchild,key,T,p);        /*在左子树继续查找*/

  else

    return SearchBST(T->rchild,key,T,p);        /*在右子树继续查找*/

}

/*递归二叉树查找key,查到时删除*/

Status DeleteBST(BiTree *T,int key){

  if(!*T)                                                                         /*不存在关键字等于key的数据元素*/

    return FALSE;

  else{

    if(key==(*T)->data)    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​      ​/*找到关键字等于key的数据元素*/

      return Delete(T);

    else if(key<(*T)->data)

      return DeleteBST(&(*T)->lchild,key);

    else

      return DeleteBST(&(*T)->rchild,key);

  }

}

/*在二叉树上按左边小右边大的方式插入*/

Status InsertBST(BiTree *T,int key){

  BiTree p,s;

  if(!SearchBST(*T,key,NULL,&p)){                        /*查找不成功*/

    s = (BiTree)malloc(sizeof(BiTNode));        

    s->data = key;

    s->lchild = s->rchild=NULL;

    if(!p)

      *T = s;                                                 /*插入s为新的根节点*/

    else if(key<p->data)

      p->lchild=s;                                          /*插入s为左孩子*/

    else

      p->rchild=s;                                         /*插入s为右孩子*/

    return TRUE;

  }

  else

    return FALSE;                                            /*树中已有关键字相同的节点,不再插入*/

};

 

void main(){

  int i;

  int num[] = {62,88,58,47,35,73,51,99,37,93};

  BiTree T=NULL;

  for(i=0;i<10;i++){                                        /*链表初始化数据*/

    InsertBST(&T,num[i]);

  }

  printf("中序遍历结果:");

  InOrderTraverse(T);                                    /*中序遍历二叉树*/

  printf("\n查找结果:");

  BiTree p;

  if(SearchBST(T,93,NULL,&p)){     ​    ​       ​/*查找93*/   

    printf("%d\n",p->data);    ​    ​    ​    ​       ​/*输出查找到的结果*/

  }

  DeleteBST(&T,47);

  printf("删除47节点后的中序遍历结果:");

  InOrderTraverse(T);

  printf("\n");

};

 

运行结果:

 

posted @ 2015-08-09 21:13  依凡王子  阅读(768)  评论(0编辑  收藏  举报