当前位置:  编程技术>c/c++/嵌入式

c语言实现二叉查找树实例方法

    来源: 互联网  发布时间:2014-10-22

    本文导语:  以下为算法详细流程及其实现。由于算法都用伪代码给出,就免了一些文字描述。 代码如下:/*******************************************=================JJ日记=====================作者: JJDiaries(阿呆) 邮箱:JJDiaries@gmail.com日期: 2013-11-13=============...

以下为算法详细流程及其实现。由于算法都用伪代码给出,就免了一些文字描述。

代码如下:

/*******************************************
=================JJ日记=====================
作者: JJDiaries(阿呆)
邮箱:JJDiaries@gmail.com
日期: 2013-11-13
============================================
二叉查找树,支持的操作包括:SERACH、MINIMUM、
MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT、DELETE。
定理:对于一个高度为h的二叉查找树,操作SERACH、MINIMUM、
MAXIMUM、PREDECESSOR、SUCCESSOR的运行时间均为O(h)
*******************************************/

/*================JJ日记=====================
作者: JJDiaries(阿呆)
邮箱:JJDiaries@gmail.com
日期: 2013-11-13
============================================*/
#include
#include
#include
#define WORDLEN 16
//定义一个节点,除了存放key值外,还包含了一个data字符数组用于存放一个单词
struct node{
    int key;
    char data[WORDLEN];
    struct node *parent;
    struct node *left;
    struct node *right;
};
typedef struct node * tree;

/*============================================
树的中序遍历
INORDER_TREE_WALK(x)
    if x!=NIL
        then INORDER_TREE_WALK(left[x])
             print key[x]
             INORDER_TREE_WALK(left[x])
============================================*/   
void inorder_tree_walk(tree T)
{
    if(T!=NULL){
        inorder_tree_walk(T->left);
        printf("key:%d   words:%sn",T->key,T->data);
        inorder_tree_walk(T->right);
    }
}


/*============================================
树的搜索,返回含有关键字k的结点
TREE_SEARCH(x,k) //递归版本
    if x=NIL or k =key[x]
        then return x
    if kright,k);
}
//非递归版本
struct node* tree_search1(tree T,int k)
{
    while(T!=NULL && T->key!=k)
        if(k < T->key)
            T=T->left;
        else
            T=T->right;
    return T;
}

/*============================================
返回key值最小的结点
TREE_MINIMUM(x)
    while left[x]!=NIL
        do x left != NULL)
        T=T->left;
    return T;
}

/*============================================
返回key值最大的结点
TREE_MAXMUM(x)
    while right[x]!=NIL
        do x right != NULL)
        T=T->right;
    return T;
}
/*============================================   
中序遍历下,返回某一结点的后继结点
1)如果结点x有右子结点,则其后继结点为右子树中最小结点。
2)如果结点x没有右子树,且x有一个后继y,则y是x的最低祖先结点
且y的左儿子也是x的祖先。
TREE_SUCCESSOR(x)
    if right[x] != NIL
        return TREE_MINIMUM(right[x])
    y=p[x]
    while y!=NIL and x=right[y] //如果x=left[y],那么x的后继就是y,跳出while循环,直接返回y即可
        do x right);
    struct node *y=T->parent;
    while(y!=NULL && T == y->right){
        T=y;
        y=y->parent;
    }
    return y;
}


/*===========================================
插入操作
思路:从根节点一路往下寻找插入位置,用指针x跟踪这条寻找路径,并用指针y指向x的父结点
TREE_INSERT(T,z)
    y=NIL
    x=root[T]
    while x!= NIL //直到x为空,这个空位置即为需要插入的位置
        do yright;
    }
    z->parent=y;
    if(z->key < y->key)
        y->left=z;
    else
        y->right=z;
}

/*===============================================
删除操作
删除操作分为三类情况:
1)若要删除的节点z没有子女,则只需修改z的父节点的该子女为NIL即可
2)若要删除的节点z只有一个子女,则只需将z的这个子女与z的父节点连接起来即可
3)若要删除的节点z有两个子女,则需要先删除z的后继y,再用y的内容替换z的内容。
TREE_DELETE(T,z)
    if left[z]=NIL || right[z]=NIL  //把要删除的节点先保存在y中
        then y


    
 
 

您可能感兴趣的文章:

  • HTML超文本标记语言教程及实例
  • LINUX 或者Windows 如何保证一个进程只有一个实例在运行?如果是C语言,JAVA语言开发,又怎么样保证?
  • 大家帮我推荐些在linux下用c语言对数据库操作编程的实例或资料吧!谢谢!
  • C语言构建动态数组完整实例
  • C语言实现堆排序的简单实例
  • C语言实现杨辉三角实例
  • c语言 字符串转大写的简单实例
  • C语言二维数组的处理实例
  • c语言如何实现只运行单个进程实例?
  • C语言中自动隐式转换与类型强制转换实例分析
  • C语言十进制转二进制代码实例
  • C语言变量类型与输出控制用法实例教程
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • C语言的递归思想实例分析
  • C语言二叉树的非递归遍历实例分析
  • C语言中qsort函数用法实例小结
  • C语言程序,软定时器应用的实例
  • c语言全盘搜索指定文件的实例代码
  • C语言连续子向量的最大和及时间度量实例
  • C语言安全之数组长度与指针实例解析
  • C语言循环队列的表示与实现实例详解
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 纯C语言:折半查找源码分享
  • C语言实现输入一颗二元查找树并将该树转换为它的镜像
  • 请问如何用C语言编写查找并杀死僵死进程的程序?在线等。。。。
  • C语言使用stdlib.h库函数的二分查找和快速排序的实现代码
  • C语言实现带头结点的链表的创建、查找、插入、删除操作
  • c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • c语言实现MD5算法完整代码示例
  • 网站重定向用C语言实现iptables,ACL实现
  • c语言基于libpcap实现一个抓包程序过程
  • C语言实现的mogstored守护进程 cmogstored
  • MD5算法的C语言实现
  • Linux 下的C语言实现数据库连接池操作。
  • 求助,在linux下,c语言和汇编语言的接口是什么? iis7站长之家
  • C语言的KD树实现 kdtree
  • 如何实现类似PHP.PB等语言中eval的函数功能?
  • 怎样用JAVA语言实现对串口的操作?
  • 请问《软件工程java语言实现》一书在那里能下载
  • R语言的Java实现 FastR_
  • LINUX下用C语言实现修改目录名字。
  • 求在linux下用c语言实现数据库连接池的操作。
  • linux下FTP服务器与客户端的C语言实现
  • 类似于Shell界面下setup命令的文本模式菜单用C语言如何实现
  • PHP 语言实现 HippyVM
  • java语言实现监控程序
  • c语言实现程序互斥问题 急.....
  • 2013年7月和2013年8月编程语言排行榜
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • 动态编程语言 LIME编程语言




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3