数据结构-如何用二叉树实现hash表(C语言)

      在用二叉树实现散列表之前,首先需要明白的是二叉树与散列表各自的特性。


       对于二叉树,主要表现形式是一对二;拿链型二叉树来说,即一个结点含有一个前驱,两个后继,两个后继即是该结点的两个孩子,如图。建立和处理用递归的方法可以轻松实现。具体关于树的结构在此不再详解。


       对于散列表,通俗来说,即对于将要插入的元素再通过一种函数式(如取余)后,得到一个具体数字(或字符),这个数字(或字符)将决定该元素所存放的位置,如果这个位置已经存有元素,则需要再次经过一系列的处理(或计算)得到一个新的地址位置,然后再原来的元素存入该为空的位置;具体的实现方法在此也不再详解。


       在对两者进行结合的过程中,需要考虑两者的特性,然后再进行实现。下面是个人在VC环境下使用了两个自定义函数对其进行中序实现的过程。


      数字可以分为两种,奇数和偶数,根据此特点,可以对该数字进行不断的除二取余的方式得到储存地址


      如图,首先插入的数是2,2%2==0,则在头结点的左边建立一个结点,存放数字2,并将其地址赋予头结点的lchild,然后插入的是奇数3,判断得其为奇数,故存放与右侧地址2;在再次插入偶数6时,经判断,6是偶数,而地址1中又存有元素,则需要重新寻找新的空的地址,再次做出的处理是6/2=3;3是奇数,则存放的是4,即作为1的右子树,依次类推,在相应的地址已经存放有元素的情况下,改变参数,寻找新的地址。由于每个数在取余过一定的次数以后,得到的数是不会重复的,所以每一个数字都会有一个地址来存放,不会发生冲突,二叉树就可以顺利实现。

      在其中需要注意的是,每个元素在经过除二之后虽然参数发生了变化,但是在找到并开辟好了需要存放该元素的空间后,存放的元素却还是客户端键入的原数字,所以在程序的运行中,要注意赋值对象是否正确。所以我在程序的实现中,采用了函数嵌套的方法,一个函数的作用是找到地址开辟空间,其返回值便是需要进行赋值的空间,在调用过后,只需将原来的元素放到该返回地址的相应区域即可。


       如果各位还不够明白,则下面开始解读程序。


       在运行开始,用户首先键入数字2,初始化成功的情况下,判断出2的存放位置应是位置1,(满足条件2%2==0&&p->lchild==NULL)这时建立一个结点,把这个结点放到头结点的左子树处,返回这个新建结点的地址,find函数执行一次,由于判断语句是else if型,直接退出进入insert函数实现赋值。在插入12时,满足else if (data%2==0&&p->lchild !=NULL),进入递归,p指向的是地址1,12/2==6,参数为6,对6继续判断,满足else if (data%2==0&&p->lchild!=NULL),再次递归,直到else if (data%2==1&&p->rchild==NULL),此时,data为3,开始创建空间并且退出递归,最后,在insert中返回的地址仍为新开辟的地址,此时开始赋值。


       在进行删除的过程中,只需要找到对应与欲删除元素相匹配的地址,然后改变地址中元素的值即可(如if (p->data==data)p->data=-1;)遍历时遇到-1即不进行遍历即可,不需要释放空间。


以上存属个人看法,如有不足,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,205评论 0 25
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,762评论 0 19
  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,646评论 4 32
  • 今天粗略的研究了一下nodejs操作数据库的包,觉得nodejs连接数据库不错。 nodejs如何操作mysql?...
    ppmoon阅读 7,034评论 2 49
  • 一首歌,很好听。 尤其是用吴侬软语唱的话,就更好听了。 现在在耳边无限循环这首歌呢。 有乌衣巷,有桃叶渡,有梁间燕...
    林香砌阅读 540评论 5 8