二叉查找树的部分例程

原创 2013年12月05日 14:38:40

searchtree.h

#ifndef SEARCHTREE_H_INCLUDED
#define SEARCHTREE_H_INCLUDED

typedef  int ElementType;
struct treenode;
typedef  struct treenode *Position;
typedef  Position  SearchTree;
struct  treenode
{
    ElementType  data;
    SearchTree  left;
    SearchTree  right;
};

SearchTree  MakeEmpty(SearchTree  T);
Position  Find(ElementType  X,SearchTree  T);
Position  FindMin(SearchTree  T);
Position  FindMax(SearchTree  T);
SearchTree  Insert(ElementType  X,SearchTree  T);
SearchTree  Delete(ElementType  X,SearchTree  T);


#endif // SEARCHTREE_H_INCLUDED

searchtree.c

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

SearchTree  MakeEmpty(SearchTree  T)
{
    if(T!=NULL)
    {
        MakeEmpty(T->left);
        MakeEmpty(T->right);
        free(T);
    }

    return  NULL;
}


Position  Find(ElementType  X,SearchTree  T)
{
    if(T==NULL)
        return  NULL;
    else if(X <T->data)
        return  Find(X, T->left);
    else if(X >T->data)
        return  Find(X,T->right);
    else
        return  T;
}


Position  FindMin(SearchTree  T)
{
    if(T==NULL)
        return  NULL;
    else  if(T->left ==NULL)
        return T;
    else
        return FindMin(T->left);
}


Position  FindMax(SearchTree  T)
{
    if(T!=NULL)
        while(T->right!=NULL)
              T=T->right;

    return T;
}


SearchTree  Insert(ElementType  X,SearchTree  T)
{
    if(T==NULL)
    {
        T=(SearchTree)malloc(sizeof(struct treenode));
        if(T==NULL)
            printf("Error: out of space!!!");
        else
        {
            T->data=X;
            T->left =T->right =NULL;
        }
    }
    else  if(X <T->data)
    {
        T->left =Insert(X, T->left);
    }
    else  if(X >T->data)
    {
        T->right  =Insert(X , T->right);
    }

    return T;   /**< don't forget  this line!!!! */
}



SearchTree  Delete(ElementType  X,SearchTree  T)
{
    Position  temp;

    if(T==NULL)
        printf("Error: not this element!!!");
    else if(X <T->data)
        T->left =Delete(X, T->left);   /**<  Go left */
    else if(X >T->data)
        T->right =Delete(X, T->right);  /**< go  right */
    else     /**< find  element,delete it */
    {
        if(T->left && T->right)
        {
            temp =FindMin(T->right) ;  /**< the minest value  in right subtree */
            T->data =temp->data;
            T->right =Delete(T->data, T->right);   /**< 删去右子树中的最小节点,可以编写deletemin函数以提高效率 */
        }
        else
        {
            temp =T;
            if(T->left ==NULL)
                T=T->right;
            else
                T=T->left;
            free(temp);
        }
    }

    return  T;
}


二叉查找树的基本例程

使二叉树为二叉查找树(Binary Search Tree)的性质是:对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。        ...
  • xiahouzuoxin
  • xiahouzuoxin
  • 2012年11月07日 20:13
  • 1872

数据结构:线索树之基本例程(1)

摘要:由于具有N个节点的二叉树具有N+1个NULL指针,因此在二叉查找中有一半的空间被浪费掉了.假设节点x有一个左NULL指针,则将NULL指针指向它的中缀前驱,若有一个右NULL指针,则将其指向中缀...
  • pp634077956
  • pp634077956
  • 2015年09月01日 18:12
  • 241

数据结构-二叉树和二叉查找树

先按树-二叉树-二叉查找树的顺序解释会比较清楚。 一,树 树(Tree)是n(n≥0)个结点的有限集。在任意一棵非空树中: (1)有且仅有一个特定的被称为根(Root)的结点; (2)当n>1...
  • tuke_tuke
  • tuke_tuke
  • 2015年12月20日 17:44
  • 2172

二叉查找树的应用

二叉查找树又称为二叉排序树, 它或者是一棵空树;或者是具有下列性质的二叉树:      (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;      (2)若右子树不空,则右子树...
  • liuhuiyi
  • liuhuiyi
  • 2012年07月17日 14:34
  • 1066

从二叉查找树到平衡二叉树再到红黑树

从二叉查找树到平衡二叉树再到红黑树的分析与实现
  • guimingyue
  • guimingyue
  • 2014年04月12日 11:10
  • 1677

LintCode 不同的二叉查找树

不同的二叉查找树给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种?给出n = 3,有5种不同形态的二叉查找树:1 3 3 2 1 \ ...
  • shinanhualiu
  • shinanhualiu
  • 2015年12月08日 22:03
  • 1113

#sicily#1003.计算二叉查找树的高度

来源:http://soj.sysu.edu.cn/show_problem.php?pid=1003&cid=2511 考点:用先序遍历和中序遍历查找二叉树的高度题意Description给定一个...
  • LoHiauFung
  • LoHiauFung
  • 2016年12月30日 11:31
  • 937

堆和二叉查找树的建立的时间复杂度

根据算法可以直观的推测出他们的算法复杂度为O(nlogn)但这并不精确。我们以下推导为O(n) 首先关于堆 首先这个循环是从i = headsize/2 -> 1,也就是说这是一个bott...
  • vainlyhopelim
  • vainlyhopelim
  • 2015年08月09日 18:31
  • 674

算法导论第十二章:二叉查找树

查找树是一种数据结构,它支持多种动态集合操作,包括search, minimum, maximum, predecessor, successor, insert以及delete。他既可以用作字典,也...
  • longhuihu
  • longhuihu
  • 2011年02月26日 10:04
  • 3117

lintcode validate-binary-search-tree 验证二叉查找树

问题描述lintcode笔记 代码1是用到中序遍历,要求中序遍历是严格的增序。用到了辅助空间。 代码2是leetcode上面的解法,用到了prev指针记录前一个节点,省下了辅助空间,而且要注意prev...
  • waltonhuang
  • waltonhuang
  • 2016年07月22日 17:03
  • 385
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉查找树的部分例程
举报原因:
原因补充:

(最多只允许输入30个字)