搜索二叉树的操作

搜索二叉树的数据结构定义:

/*二叉搜索树的结构定义*/
typedef struct TreeNode* SearchTree;
typedef struct TreeNode* Position;
struct TreeNode
{
    int Element;
    SearchTree Left;
    SearchTree Right;
}

搜索二叉树的插入操作:

SearchTree Insert(int x, SearchTree T)
{
    if(T == NULL)//空树
    {
        T = malloc(sizeof(struct TreeNode));
        if(T == NULL)
        {
            printf("Out of space!");
            return NULL;
        }
        else
        {
            T->Element = x;
            T->Left = T->Right = NULL;
        }
    }
    else if(x < T->Element)
        T->Left = Insert(x, T->Left);
    else if(x > T->Element)
        T->Right = Insert(x, T->Right);
    /*如果x已在树中,就什么也不做*/

    return T;

}

搜索二叉树的删除操作:

SearchTree Delete(int x, SearchTree T)
{
    SearchTree parent_p, p, q, r;
    p = T;
    parent_p = NULL;
    while(p)//查找关键字为x的结点
    {
        if(p->Element == x)
            break;
        f = p;
        if(p->Element < x)
            p = p->Right;
        else
            p = p->Left;
    }

    if(p == NULL)//如果没找到,直接返回原二叉搜索树
        return T;
    if(p->Left == NULL)//p无左孩子
    {
        if(parent_p == NULL)//p为原二叉搜索树的根
            T = T->Right;
        else if(f->Left == p)//p为左孩子
            f->Left = p->Right;
        else //p为右孩子
            f->Right = p->Right;

        p->Right = NULL//避免野指针问题
        free(p);
    }
    else//p有左孩子
    {
        q = p;
        r = p->Left;
        while(r->Right)//寻找p的左子树中最大的结点来代替p
        {
            q = r;
            r = r->Right;
        }
        if(q == p)
            q->Left = r->Left;
        else
            q->Right = r->Left;
        p->Element = r->Element;

        r->Left = NULL;//避免野指针问题
        free(r);
    }
    return T;
}

搜索二叉树的操作

时间: 2024-10-14 00:52:03

搜索二叉树的操作的相关文章

搜索二叉树

二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或具有如下性质: 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同. 左子树上所有节点的关键码(key)都小于根节点的关键码(key). 右子树上所有节点的关键码(key)都大于根节点的关键码(key). 左右子树都是二叉搜索树. 二叉搜索树相关操作: (1)插入:新节点 在二叉查找树中插入新结点,要保证插入新结点后仍能满足二叉查找树的性质.插入

java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

二叉排序树的定义: 二叉排序树满足以下三个性质(BST性质): <1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值 <2>若它的右子树非空,则右子树上所有节点的值均大于根节点的值 <3>左,右子树本身又各是一棵二叉排序树 根据二叉排序树的BST性质,可以说二叉排序树每个节点上的值(或称关键字)都是唯一的,并且二叉排序树以中序遍历输出的结果必然是一个有序的递增序列. 如下图所示: 用递归方法建立二叉排序树,减少了繁复的比较程序,效率较高.只需要知道每个节点的值

《github一天一道算法题》:搜索二叉树接口实现大合集

读书.思考.写代码! 说明: (1)这里实现了搜索二叉树的全部常用操作 (2)限于时间和精力,实现的较为粗糙,内存泄露.成员变量访问控制.返回类型.异常安全等没有照顾的到 (3)一切实现的手段都是贴近底层操作,关注原理.以后可能对推倒重来,实现一个完备的接口系统. /********************************************* * [email protected] * 题目:二叉树接口实现大合集 * 具体:二叉树的创建.插入.最大值.最小值.前中后序递归遍历与非递

第八十六题(搜索二叉树建立)

如何编写一个程序,把一个有序整数数组放到二叉树中? 分析:为了让搜索二叉树的查找等操作接近于O(log(n)).我们以有序数组的中间位置的数字作为搜索二叉树的根节点,以其左半部分数据建立搜索二叉树作为根节点的左子树.以其有半部分数据建立搜索二叉树作为根节点的右子树.这是一个递归的定义,因此程序也採用递归实现. #include<iostream> using namespace std; namespace MS100P_86 { struct BSTree { int data; BSTre

判断一个数列是不是搜索二叉树后续遍历输出的结果

剑平面阿里被问到这个,刚开始画了下看有什么性质,乱蒙了几个都被推翻了,初始感觉就是要O(n)的,因为印象中BST的构树都可以O(nlogn)搞定.然后剑平说最后一个数肯定是根节点,一下反应过来了,就是二分出间隔点然后两边递归判断,不过这好像还是构树的思路,可以把整棵树构造出来.然后剑平说不是二分,直接遍历.不科学啊,明显的二分,然后去网上搜一下,都是遍历的,O(n^2)的吧.想了想,二分是当做合法的情况来构树的,不合法怎么判断?构造出搜索二叉树后中序遍历一下不就行了么,妥妥的O(nlogn)吧.

二叉树插入操作

/* 功能:将一个节点插入到二叉树中节点的子节点中 输入: p,c ,RL p:节点将插入到p所指向的节点的子节点中 c:指向待插入的节点 RL:为0表示插入到左子树,为1表示插入到右子树 输出:bool */ template<typename T> bool BinaryTree<T>::InsertChild(BTNode<T> *p,BTNode<T> *c,int RL) { if(p) { if(RL==0) //插入到p的左节点 { c->

数据结构--‘搜索二叉树’

'二叉树'是数据结构中比较重要的一部分,这里主要讨论一下'搜索二叉树',针对'搜索二叉树的插入.删除和查找节点进行分情况讨论,希望能够帮助读者更加的理解搜索二叉树的原理. ◆搜索二叉树的性质: 1.每个节点都有一个一个作为搜索依据的关键码,所有节点的关键码都不相同. 2.左子树所有的关键码(key)都小于根节点的关键码(key). 3.右子树所有的关键码(key)都大于根节点的关键码(key). 4.左.右子树都是二叉搜索树. 实现'搜索二叉树'的节点结构可以实现为K形式,和K.V形式,若实现K

【数据结构】搜索二叉树的(递归与非递归)实现,包括:增Insert,删Remove,查Find

搜索二叉树,是二叉树一种特殊的结构. 特点: (1)每个节点都有一个关键码,并且关键码不重复. (2)左子树上的每个节点的关键码都小于根节点的关键码. (3)右子树上的每个节点的关键码都大于根节点的关键码. (4)左右子树都是搜索二叉树. 下面,为方便大家理解,我举例画一个搜索二叉树,如下: 代码见下: #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; //搜索二叉树的节点结构 template&

二叉树各种操作的总结

本篇文章部分参考轻松搞定面试中的二叉树题目实现. 求二叉树中的节点个数 求二叉树中叶子节点的个数 求二叉树的深度 求二叉树第K层的节点个数 递归遍历前序中序后序 非递归遍历前序中序后序层序 1 前序遍历 2 中序遍历 3 后序遍历 4 层序遍历 将二叉查找树变为有序的双向链表 判断两棵二叉树是否结构相同 判断二叉树是不是平衡二叉树 判断二叉树是否是搜索二叉树 求二叉树中两个节点的最低公共祖先节点 求二叉树中节点的最大距离 由前序遍历序列和中序遍历序列重建二叉树 1. 求二叉树中的节点个数 递归求