树和二叉树5——树型查找I——BST

(保留版权,欢迎转载。请注明原始链接:http://blog.youkuaiyun.com/markcnsc/article/details/8568822)

二叉搜索树(BST),平衡二叉树(AVL),红黑树,B*树和Tre树。

二叉搜索树(BST)

1. 定义

左子树上任意的值Kl <= 结点N的值Kn <= 右子树上任意的值Kr。

2. 性质

中序遍历BST,可得二叉树所有结点的值的非降序排列。

3. 操作

3.1. 声明

typedef struct _BST {
    struct _BST *lc, *rc;
    int k;
} BST;

3.2 查找

BST* Search (BST* p, int v)
{
    while (p && p->k != v)
        p = p->k > v ? p->lc : p->rc;
    /*while (p)//strictly, more efficient!
        if (p->k > v) p = p->lc; else if (p->k < v) p = p->rc; else break;*/
    return p;
}

3.3 插入

BST* Insert (BST** p, int v)
{
    while (*p && (*p)->k != v)
        p = (*p)->k > v ? &(*p)->lc : &(*p)->rc;

    if (!*p) {
        if(!(*p = malloc (sizeof(BST)))) exit (-1);
        (*p)->k = v; 
        (*p)->lc = (*p)->rc = 0;
    }
    return *p;
}

3.4 删除

int Delete (BST** p, int v)
{
    BST* q;
    
    while (*p && (*p)->k != v)
        p = (*p)->k > v ? &(*p)->lc : &(*p)->rc;

    if (!(q = *p)) return -1;
    if (!(*p)->lc || !(*p)->rc) {
        *p = (*p)->lc ? (*p)->lc : (*p)->rc;
    }
    else {/* also OK exchange lc <-> rc */
        for (p = &(*p)->lc; (*p)->rc; p = &(*p)->rc);
        q->k = (*p)->k;
        q = (*p);
        *p = (*p)->lc;
    }
    free (q);
    return 0;
}

3.5 实例

int main (int argc, char** argv)
{
    BST* h = NULL;/*Initilization! Or Coredump.*/
    int data[] = {38, 55, 64, 78, 35, 99, 32, 67, 88};
    int i, n, r;
    
    for (i = 0; i < sizeof(data)/sizeof(data[0]); i ++) {
        Insert (&h, data[i]);
    }
    while (1) {
        printf ("input num:\n");
        scanf ("%d", &n);
        r = Delete (&h, n);
        printf ("%d -- %s\n", n, r ? "None" : "Found and Removed");
    }
    return 0;
}
<think>好的,用户想了解二叉树的概念及区别,以及它们的应用场景。首先我需要回顾一下二叉树的基本定义,然后比较它们的区别,再讨论应用场景。根据提供的引用内容,先理清二叉树的结构特点。 首先,是一种层次结构,每个节点可以有多个子节点,而二叉树的每个节点最多有两个子节点,且左右子有顺序之分。引用2提到二叉树不存在度大于2的结点,并且子顺序不能颠倒。这点很重要,说明二叉树的结构更严格。 接下来,二叉树的区别可能包括子节点数量、顺序是否重要、是否可以为空等。引用3指出二叉树可以为空,而通常至少有一个根节点?需要确认这点。实际上,有些定义中也可以为空,但可能需要明确说明。根据引用3,二叉树可以为空,如果不为空则必须有根节点、左子右子。这可能不准确,因为二叉树的子可以为空,但结构上仍然存在左右之分。 然后,应用场景方面,如文件系统、组织结构,二叉树如二叉搜索、哈夫曼编码等。引用4提到邻接表在处理结构时高效,可能涉及到的存储结构。而引用1中的代码示例是关于二叉树的链式存储,根节点指针的定义。 需要确保回答结构清晰,分点说明概念、区别应用场景。可能用户对二叉树的基本概念不太清楚,需要先解释再比较。同时要引用提供的资料,比如引用23关于二叉树的结构特点,引用1关于存储结构。 最后,生成相关问题时要围绕二叉树的区别、应用、存储方式等。比如二叉树为什么更常用在搜索中,或者的遍历方式差异等。</think>### 二叉树的概念及区别 #### 1. 基本定义 - ****:一种非线性数据结构,由节点(node)边(edge)组成,具有以下特点: - 每个节点可以有零个或多个子节点; - 只有一个根节点(无父节点); - 除根节点外,其他节点有且仅有一个父节点; - 节点之间不能形成环[^2][^3]。 - **二叉树**:一种特殊的树型结构,每个节点最多有两个子节点(左子右子),且左右子的顺序不能颠倒。二叉树可以为空[^3]。 #### 2. 核心区别 | **特性** | **** | **二叉树** | |------------------|----------------------------|----------------------------| | 子节点数量 | 任意多个 | 最多两个 | | 子顺序 | 无序 | 严格区分左、右子 | | 空结构 | 通常至少包含根节点 | 允许为空 | | 应用目标 | 层次关系(如文件系统) | 高效搜索、递归操作 | #### 3. 应用场景 - **的应用**: - 文件系统:目录结构是典型的形层次; - 组织结构:公司部门层级; - XML/JSON数据解析:形结构表示嵌套关系[^1][^4]。 - **二叉树的应用**: - **二叉搜索BST)**:利用左小右大的特性实现$O(\log n)$时间复杂度的搜索; - **堆(Heap)**:优先队列的实现基础; - **哈夫曼编码**:通过最优二叉树实现数据压缩; - **表达式**:用于编译器解析算术表达式。 #### 4. 存储结构对比 - ****:常用邻接表或链表数组存储,动态扩展性强(如引用4中的`TreeNode* levelArray[MAX_LEVELS]`)。 - **二叉树**:通常使用链式存储(如引用1中的`BinaryTreeNode* root`)或顺序存储(数组表示)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值