zoukankan      html  css  js  c++  java
  • 数据结构之二叉树查找

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

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

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

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

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

    图解

        ​        ​    ​    ​    ​    ​​

    #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(" 查找结果:");

      BiTree p;

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

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

      }

      DeleteBST(&T,47);

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

      InOrderTraverse(T);

      printf(" ");

    };

    运行结果:

  • 相关阅读:
    分享:两个栈实现一个队列的功能
    分享:要关注技术,但也要关注所做的事情
    linux网络编程中阻塞和非阻塞socket的区别
    分享:C++参数传递方式
    linux非阻塞socket教程
    有用和有趣的产品秤砣
    查找 grep r TFramedTransport *
    分享:SecureCRT使用VIM语法高亮
    linux 非阻塞 socket Google 搜索
    linux c语言 select函数用法 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/zhengjunfei/p/4716376.html
Copyright © 2011-2022 走看看