C语言/C++常见习题问答集锦(六十八) 之二叉搜索树揭秘

C语言/C++常见习题问答集锦(六十八) 之二叉搜索树揭秘

程序之美

在这里插入图片描述

题目描述
输入一组整数,建立一个二叉搜索树(二叉排序树,二叉查找树)。
要求:递归方式

分析:
二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。

核心代码:

#include<stdio.h>
#include<stdlib.h>
struct tree
{
   int data;
   struct tree *left;
   struct tree *right;
};
typedef struct tree treenode;
typedef treenode *btree;
btree creatbtree( int *data,int pos )
{
   btree newnode;
       if(data[pos] == 0|| pos > 15 )
        return NULL;
       else
          {
            newnode = (btree)malloc(sizeof(treenode));

            newnode->data = data[pos];
            newnode->left = creatbtree(data,2*pos);

 			newnode->right = creatbtree(data,2*pos+1);

    		return  newnode;
          }
}

btree btreefind(btree ptr,int value)
{
    while( ptr != NULL )
      {
          if( ptr->data == value )
               {  
             return ptr;
              }
          else
                 if ( ptr->data > value)
                   ptr = ptr->left;
                 else
                   ptr = ptr->right;
      }
}

btree btreesearch(btree ptr,int value)
{
    btree ptr1,ptr2;
       if( ptr != NULL )
          {
             if ( ptr->data  == value)
                 return    ptr ;
             else
                   ptr1 = btreesearch(ptr->left,value);    
     
                 ptr2= btreesearch(ptr->right,value);   

               if( ptr1 != NULL)
                  return ptr2; 
               else
                  return NULL;
          }
        else 
          return NULL;  
}

int main()
{
   btree root = NULL;
    btree ptr = NULL;
    int value,n, i;

   int data[512];
   printf("请输入数据个数:\n");
   scanf("%d", &n);
   if(n <= 0){
       return -1;
   }
   printf("请输入数据:\n");
   for(i = 0; i < n; i ++){
    scanf("%d",&data[i]);
   }
    root = creatbtree(data,1);
        printf("请输入寻找结点数据(1 —— 9)\n");
           scanf("%d",&value);

      ptr  = btreefind(root,value);
          
          if(  ptr != NULL )
                printf("二叉查找树:结点数据是 %d\n",ptr->data);
    else
          printf("二叉查找树没有找到\n");


      ptr  = btreesearch(root,value);
          
          if(  ptr != NULL )
                printf("遍历查找:结点数据是 %d\n",ptr->data);
    else
          printf("二叉查找树没有找到\n");
   return 0 ; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值