第十周项目-- 【设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数】


/*
        *Copyright  (c) 2015, 烟台大学计算机与控制工程学院
        *All rights reserved
        *作者:李宗政
        *完成日期:2015年11月16日
        *版本号:V1.0
        *内容描述:建立二叉树算法库,设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数。


*/

头文件

#ifndef BTREE_H_INCLUDED
#define BTREE_H_INCLUDED

#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;              //数据元素
    struct node *lchild;        //指向左孩子
    struct node *rchild;        //指向右孩子
} BTNode;
void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链
BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针
BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针
BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针
int BTNodeDepth(BTNode *b); //求二叉树b的深度
void DispBTNode(BTNode *b); //以括号表示法输出二叉树
void DestroyBTNode(BTNode *&b);  //销毁二叉树

#endif // BTREE_H_INCLUDED


主函数

#include <stdio.h>
#include <malloc.h>
#include "btree.h"

void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链
{
    BTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;             //建立的二叉树初始时为空
    ch=str[j];
    while (ch!='\0')    //str未扫描完时循环
    {
        switch(ch)
        {
        case '(':
            top++;
            St[top]=p;
            k=1;
            break;      //为左节点
        case ')':
            top--;
            break;
        case ',':
            k=2;
            break;                          //为右节点
        default:
            p=(BTNode *)malloc(sizeof(BTNode));
            p->data=ch;
            p->lchild=p->rchild=NULL;
            if (b==NULL)                    //p指向二叉树的根节点
                b=p;
            else                            //已建立二叉树根节点
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild=p;
                    break;
                case 2:
                    St[top]->rchild=p;
                    break;
                }
            }
        }
        j++;
        ch=str[j];
    }
}
BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针
{
    BTNode *p;
    if (b==NULL)
        return NULL;
    else if (b->data==x)
        return b;
    else
    {
        p=FindNode(b->lchild,x);
        if (p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
    }
}
BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针
{
    return p->lchild;
}
BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针
{
    return p->rchild;
}
int BTNodeDepth(BTNode *b)  //求二叉树b的深度
{
    int lchilddep,rchilddep;
    if (b==NULL)
        return(0);                          //空树的高度为0
    else
    {
        lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep
        rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep
        return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
    }
}
void DispBTNode(BTNode *b)  //以括号表示法输出二叉树
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBTNode(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
}
void DestroyBTNode(BTNode *&b)   //销毁二叉树
{
    if (b!=NULL)
    {
        DestroyBTNode(b->lchild);
        DestroyBTNode(b->rchild);
        free(b);
    }
}


测试函数

#include <stdio.h>
#include "btree.h"

int Level(BTNode *b,ElemType x,int h)
{
    int l;
    if (b==NULL)
        return 0;
    else if (b->data==x)
        return h;
    else
    {
        l=Level(b->lchild,x,h+1);
        if (l==0)
            return Level(b->rchild,x,h+1);
        else
            return l;
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("值为\'K\'的节点在二叉树中出现在第 %d 层上n",Level(b,'K',1));
    DestroyBTNode(b);
    return 0;
}


输出结果

<think>嗯,用户想了解二叉排序的实现和查找操作,特别是用二叉链表存储结构,包括插入节点、查找节点,还有输入输出的示例。首先,我需要回顾一下二叉排序的基本概念和特性。根据引用[2]和引用[4],二叉排序的定义是每个节点的左子所有节点小于根,右子所有节点大于根,左右子本身也是二叉排序。存储结构方面,引用[3]提到使用链式存储,即每个节点有lchild、data、rchild三个部分。 接下来,用户需要具体的实现步骤,包括插入、查找以及输入输出。插入节点的逻辑应该是递归或非递归地比较大小,找到合适的位置插入新节点。查找则是从根开始,比较目标,决定向左还是向右子查找。输入方面,用户可能需要从文件读取整数序列,生成二叉排序,然后进行操作。输出包括中序遍历结果,查找结果以及平均查找长度等。 然后,用户提到输入输出格式示例。比如,输入可能是一组数字,输出中序遍历后的排序结果,查找某个元素是否存在,删除后的结果等。根据引用[1]中的具体要求,生成二叉排序后需要进行中序遍历,计算平均查找长度,删除节点等操作。这里可能需要用代码示例来展示这些步骤。 另外,要注意二叉链表的结构定义,每个节点包含左右孩子指针和数据域。代码实现时,插入函数可能需要递归地创建节点,查找函数同样递归或循环。例如,引用[3]中的SearchBST函数展示了递归查找的方法。 用户还可能关心如何计算平均查找长度。这需要统计每个节点的深度,计算所有节点深度之和除以节点数量。引用[1]中提到计算平均查找长度,可能需要遍历并记录每个节点的层次。 最后,用户需要具体的输入输出示例,比如输入序列,生成后的中序遍历结果,查找某个元素的结果,删除后的中序遍历等。例如,输入5 3 7 2 4,中序遍历输出2 3 4 5 7,查找4成功,删除3后的遍历结果变为2 4 5 7。 需要确保代码部分用中文注释,并且符合用户要求的存储结构。同时,回答要结构清晰,分步骤解释实现过程,并给出示例代码和输入输出样例。可能还需要解释各个函数的作用,比如插入、查找、中序遍历等,以及如何计算平均查找长度。 总结起来,回答应包括存储结构定义,插入和查找的算法步骤,代码示例,输入输出示例,以及关键点的解释,如平均查找长度的计算。同时,根据用户提供的引用内容,正确引用相关部分,如链式存储结构的优势,删除节点的不同情况处理等。</think>### 二叉排序的实现与查找算法二叉链表存储结构) #### 一、存储结构定义 二叉链表存储结构的每个结点包含三个部分: ```c typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; // 左右孩子指针 } BiTNode, *BiTree; ``` #### 二、核心算法实现 1. **插入节点** **算法逻辑**: -为空,则新建根节点 - 若插入 < 当前节点,递归插入左子 - 若插入 > 当前节点,递归插入右子 ```c void InsertBST(BiTree *T, int key) { if (*T == NULL) { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = key; (*T)->lchild = (*T)->rchild = NULL; } else if (key < (*T)->data) { InsertBST(&(*T)->lchild, key); } else { InsertBST(&(*T)->rchild, key); } } ``` 2. **查找节点** **算法逻辑**: - 从根节点开始,与目标比较决定搜索方向 - 找到则返回节点指针,否则返回NULL ```c BiTree SearchBST(BiTree T, int key) { if (T == NULL || T->data == key) { return T; } else if (key < T->data) { return SearchBST(T->lchild, key); } else { return SearchBST(T->rchild, key); } } ``` #### 三、输入输出逻辑示例 **输入格式**: 从文件`input.txt`读取整数序列(例如:`5 3 7 2 4`) **操作流程**: 1. 生成二叉排序 2. 中序遍历输出(结果为升序序列) 3. 查找元素并输出结果 4. 计算平均查找长度(ASL) **示例代码片段**: ```c // 中序遍历 void InOrderTraversal(BiTree T) { if (T != NULL) { InOrderTraversal(T->lchild); printf("%d ", T->data); InOrderTraversal(T->rchild); } } // 计算ASL int CalculateASL(BiTree T, int level) { if (T == NULL) return 0; return level + CalculateASL(T->lchild, level + 1) + CalculateASL(T->rchild, level + 1); } ``` #### 四、运行示例 **输入文件内容**:`5 3 7 2 4` **输出结果**: ``` 中序遍历结果:2 3 4 5 7 查找元素4:存在 平均查找长度(ASL):2.4 ``` #### 五、关键特性 1. **时间复杂度** - 查找/插入:平均$O(\log n)$,最坏$O(n)$(退化为链表)[^2] 2. **优势** - 动态维护数据有序性,支持高效插入和删除[^3] 3. **应用场景** - 数据库索引、文件系统目录结构、动态查找表[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值