第14周 项目2 - 二叉树排序树中查找的路径

/* 
*文件名称:1.pp 
*作者:崔从敏 
*完成日期:2015年12月4日 
*问题描述:二叉树排序树中查找的路径  */

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int KeyType;                    //定义关键字类型
typedef char InfoType;
typedef struct node                     //记录类型
{
    KeyType key;                        //关键字项
    InfoType data;                      //其他数据域
    struct node *lchild,*rchild;        //左右孩子指针
} BSTNode;
int path[MaxSize];                      //全局变量,用于存放路径
void DispBST(BSTNode *b);               //函数说明
int InsertBST(BSTNode *&p,KeyType k)    //在以*p为根节点的BST中插入一个关键字为k的节点
{
    if (p==NULL)                        //原树为空, 新插入的记录为根节点
    {
        p=(BSTNode *)malloc(sizeof(BSTNode));
        p->key=k;
        p->lchild=p->rchild=NULL;
        return 1;
    }
    else if (k==p->key)
        return 0;
    else if (k<p->key)
        return InsertBST(p->lchild,k);  //插入到*p的左子树中
    else
        return InsertBST(p->rchild,k);  //插入到*p的右子树中
}
BSTNode *CreatBST(KeyType A[],int n)
//由数组A中的关键字建立一棵二叉排序树
{
    BSTNode *bt=NULL;                   //初始时bt为空树
    int i=0;
    while (i<n)
        InsertBST(bt,A[i++]);       //将A[i]插入二叉排序树T中
    return bt;                          //返回建立的二叉排序树的根指针
}

//在二叉排序树中查找,记经过的节点记录在path中,返回值为最后查找节点在path中存储的下标
int SearchBST(BSTNode *bt,KeyType k,KeyType path[],int i)
{
    if (bt==NULL)
        return i;
    else if (k==bt->key)    //找到了节点
    {
        path[i+1]=bt->key;  //输出其路径
        return i+1;
    }
    else
    {
        path[i+1]=bt->key;
        if (k<bt->key)
            SearchBST(bt->lchild,k,path,i+1);  //在左子树中递归查找
        else
            SearchBST(bt->rchild,k,path,i+1);  //在右子树中递归查找
    }
}

//查找并显示经过的路径
void SearchResult(BSTNode *bt, int k1)
{
    int r, j;
    r = SearchBST(bt,k1,path,-1);
    for (j=0; j<=r; j++)
        printf("%3d",path[j]);
    printf("\n");
}

void DispBST(BSTNode *bt)
//以括号表示法输出二叉排序树bt
{
    if (bt!=NULL)
    {
        printf("%d",bt->key);
        if (bt->lchild!=NULL || bt->rchild!=NULL)
        {
            printf("(");
            DispBST(bt->lchild);
            if (bt->rchild!=NULL) printf(",");
            DispBST(bt->rchild);
            printf(")");
        }
    }
}

int main()
{
    BSTNode *bt;
    KeyType k1=65, k2=32;
    int a[]= {43,91,10,18,82,65,33,59,27,73},n=10;
    printf("创建的BST树:");
    bt=CreatBST(a,n);
    DispBST(bt);
    printf("\n");
    printf("  查找%d关键字:",k1);
    SearchResult(bt,k1);
    printf("  查找%d关键字:",k2);
    SearchResult(bt,k2);
    return 0;
}


运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉排序树的平均查找长度公式为:ASL = (1/n) * ∑(ni=1)wi,其n为节点数,wi为第i个节点的深度。 首先,将这些数字按顺序插入二叉排序树,得到如下树形结构: ``` 60 / \ 30 78 / \ \ 12 45 56 ``` 该二叉排序树共有6个节点,因此n=6。 节点深度为1的只有根节点60,因此w1=1。 节点深度为2的有30和78,因此w2=2+2=4。 节点深度为3的有12、45和56,因此w3=3+3+3=9。 将wi代入公式得到:ASL = (1/6) * (1+4+9+4+3+3) = 28/6 = 14/3 ≈ 4.67。 因此,选项C 28/7为最接近的答案。 ### 回答2: 二叉排序树是一种特殊的二叉树,其满足以下性质:对于树中的每一个节点,其左子树中的每个节点的值均小于该节点的值,而其右子树中的每个节点的值均大于该节点的值。 已知由(60,30,56,78,12,45)序列构成的二叉排序树,我们可以按照以下步骤进行等概率成功查找: 1. 从根节点开始,将要查找的值与当前节点的值进行比较。 2. 如果要查找的值等于当前节点的值,则查找成功;如果要查找的值小于当前节点的值,则继续在左子树中查找;如果要查找的值大于当前节点的值,则继续在右子树中查找。 3. 重复步骤2,直到找到要查找的值或者当前节点为空。 根据二叉排序树的性质,我们可以得到以下查找路径的长度:1, 2, 3, 3, 3, 3。 平均查找长度是指在所有可能的查找路径长度的平均值。对于给定的序列构成的二叉排序树,我们可以计算出所有可能的查找路径长度之和,并除以路径的总数,得到平均查找长度。 总共有6条查找路径路径长度的总和为1+2+3+3+3+3=15,所以平均查找长度为15/6 = 2.5。 因此,答案为A. 15/6。 ### 回答3: 已知二叉排序树的构建过程如下: 1. 首先,将第一个元素60作为根节点插入树中。 2. 然后,依次将后面的元素30、56、78、12、45插入到树中,保持树的有序状态。 构建完毕后,树的结构如下: ``` 60 / \ 30 78 / \ 12 56 \ \ 45 78 ``` 对于每一个元素,查找路径长度等于从根节点到该元素所经过的边的数量。而对于二叉排序树,由于插入的过程保持有序性,每个元素都有等概率被插入到左子树或者右子树。 根据二叉排序树的结构,每个元素的查找路径长度如下: - 60的路径长度为1(根节点); - 30的路径长度为2(根节点-左子节点); - 56的路径长度为3(根节点-左子节点-右子节点); - 78的路径长度为2(根节点-右子节点); - 12的路径长度为3(根节点-左子节点-左子节点); - 45的路径长度为4(根节点-左子节点-左子节点-右子节点)。 根据等概率成功查找的平均查找长度的定义,平均查找长度等于每个元素查找路径长度的期望值。而每个元素在插入过程都有等概率被插入到左子树或者右子树,所以每个元素查找路径长度的期望值都是相同的。 因此,平均查找长度等于全部元素查找路径长度的总和除以元素数量。即:(1 + 2 + 3 + 2 + 3 + 4) / 6 = 15 / 6。 因此,答案为A. 15/6。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值