评论

数据结构折半查找判定树的画法(较简单易懂!)

数据结构折半查找判定树的画法(较简单易懂!)

复习数据结构做的笔记:

折半查找判定树的画法思路:

1. 先画出满足有序表长度的最大满二叉树,然后将剩下的结点个数一个个插入该树

2. 从上往下看,比较每个结点的左右子树结点个数,如果左右子树结点个数相同优先放右边,左边比右边少就放左边,直到往下塞到二叉树底部成为叶子结点。

对于步骤1和2的具体做法,见下列实例分析:

长度为12的有序表画出折半查找判定树

  1. 12>2^3,即最大能画出3层的满二叉树,接着将剩余5个结点插入该树

  2. 先插入h,a的左右子树结点个数都为3,则到c,c的左右子树结点个数都为1,接着到g,g的左右子树都为0,最后h到了g的右边

  3. 先插入i,a的左子树结点个数为3小于右子树的4,则到b,b的左右子树结点个数都为1,接着到e,e的左右子树都为0,最后i到了e的右边

同理后面插入J,K,L


折半查找判定树就完成了

如果要求各元素查找概率相同的情况下平均查找长度,则

n=(1*1+2*2+4*3+5*4)/12=37/12

觉得该篇文章有用的请不要忘记忘记点击左下角的大拇指~

最后一次编辑于  2021-11-15  
点赞 4
收藏
评论

3 个评论

  • 晨曦
    晨曦
    2021-11-15

    能折半查找的话,不应该是比较待插入结点和当前结点的值之间的大小,来决定应该落到左子树还是右子树吗?

    2021-11-15
    赞同 1
    回复 6
    • Smooth
      Smooth
      2021-11-15
      会比较片面,而且会不满足满二叉树的定义,如果比较待插入结点和当前结点的值之间的大小,如果一直都是比较小的,那就一直往最左下方插入,那么就不是满二叉树了
      2021-11-15
      1
      回复
    • 晨曦
      晨曦
      2021-11-16回复Smooth
      这个可以通过旋转来调整。
      2021-11-16
      回复
    • 晨曦
      晨曦
      2021-11-16回复Smooth
      而且很明显,如果比较的不是大小而是结点数量,从而判断应该落到左右子树,那么就会破坏数据的有序性,就不能折半查找了。
      2021-11-16
      回复
    • 晨曦
      晨曦
      2021-11-16回复Smooth
      AVL树、红黑树等二叉树就是插入时比较结点相对大小的。但它们有旋转调整机制,可以保证左右子树的高度差不超过1,从而维持树的平衡。而且它们满足折半查找的特点(就是二叉搜索树了)。二叉搜索树没有要求一定是满二叉树。
      2021-11-16
      回复
    • Smooth
      Smooth
      2021-11-16回复晨曦
      好!我树方面确实还不太熟悉
      2021-11-16
      1
      回复
    查看更多(1)
  • PD
    PD
    发表于移动端
    2021-11-16
    大拇指点了
    2021-11-16
    赞同 1
    回复
  • 武曲心
    武曲心
    2021-11-16

    二叉树的定义不是某节点一边子树不大于该节点,另一边不小于该节点吗,如果按字母顺序定大小,树的结构就不是这样的了。为了构造最优二叉树,根节点应该是最近中间值那个。

    2021-11-16
    赞同
    回复 7
    • 晨曦
      晨曦
      2021-11-16
      一般二叉树没有这个规定。二叉搜索树才有“某节点一边子树不大于该节点,另一边不小于该节点”这个规定。能折半查找的二叉树就是二叉搜索树。
      2021-11-16
      回复
    • 武曲心
      武曲心
      2021-11-16回复晨曦
      构造这样的结构意义何在?构造时判断插左边插右边你得找树的深度做作对比,那得先遍历出所有的子树才知道查在哪个位置吧,查找时不知道左边还是右边你也得依次遍历子树。说白了那我放哪都可以呀,合必又放左放右呢。而且你后面所说的平均查找长度n有做过验证吗,搞一定数量级数据代码出来对比看一看,只写一些东西说服不了别人。
      2021-11-16
      回复
    • 武曲心
      武曲心
      2021-11-16回复晨曦
      。。。发了才发现你不是作者哦
      2021-11-16
      回复
    • 晨曦
      晨曦
      2021-11-16回复武曲心
      没事,换个正确的地方再发一次(滑稽)
      2021-11-16
      回复
    • 晨曦
      晨曦
      2021-11-16回复武曲心
      真按照作者的思想来做的话,其实不用每次插入都遍历子树的。可以在每个结点中记录左右子树深度,每次插入完成后自底向上更新深度记录即可。这样每次插入就能快速比较左右子树的深度了。
      2021-11-16
      回复
    查看更多(2)
登录 后发表内容