网易云课堂数据结构二叉搜索树( 2015.5.9-10) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhufree
V2EX    编程

网易云课堂数据结构二叉搜索树( 2015.5.9-10)/h1>
  •  
  •   zhufree 2015-05-10 12:23:16 +08:00 3473 次点击

    这是一个创建于 3880 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好久没上了。。。
    数据结构给我的感觉就是,知道是个什么玩意儿,懂这个结构怎么实现的,但是要解决什么问题就感觉无从下手,尤其是带指针的语言,完全晕,上次计蒜客一个cpp的部分逆置单链表的题目卡了一晚上还是没弄出来,不知道到底是哪里不对劲了,心塞。

    二叉搜索树(Binary Search Tree)

    特征:
    - 非空左子树的值小于其根节点的值
    - 非空右子树的值大于其根结点的值
    - 左右子树都是二叉搜索树

    几个常用函数及实现:

    • Position Find(ElementType x,BinTree BST):查找元素X,返回地址
    Position Find(ElementType X,BinTree BST){ if(!BST) return NULL; if(X>BST->Data) return Find(X,BST->Right); else if(X<BST->Data) return Find(X,BST_>Left); else return BST; } 

    树空时直接返回NULL,树不空时,和根节点的键值比较,大于则往右找,小于则往左找,循环这一过程,尾递归方式(在返回的时候进行递归),效率不高,从编译的角度尾递归都可以用循环代替,如下

    Position IterFind(ElementType X,BinTree BST){ while(BST){ if(X>BST->Data) BST=BST->Right; else if(X<BST->Data) BST=BST->Left; else return BST; } return NULL; } 

    最大元素一定在树的最右端分支的端结点上
    最小元素一定在树的最左端分支的端结点上

    • Position FindMin(BinTree BST):查找最小元素并返回结点地址


      Position FindMin(BinTree BST){
      if(!BST) return NULL;
      else if(!BST->Left)
      return BST;
      else
      return FindMin(BST->Left);
      }

      不断往左边走

    • Position FindMax(BinTreeBST):查找最大元素并返回结点地址

      Position FindMax(BinTree BST){
      if(BST)
      while(BST->Right) BST=BST->Right;
      return BST;
      }

      不断往右边走

    • BinTree Insert(ElementType X,BinTree BST):插入元素

      BinTree Insert(ElementType X,BinTree BST){
      if(!BST){
      BST=malloc(sizeof(struct TreeNode));
      BST->Data=X;
      BST->Left=Bst->Right=NULL;
      }else{
      if(X<BST->Data)
      BST->Left=Insert(X,BST->Left);
      else if(X>BST->Data)
      BST->Right=Insert(X,Bst->Right);
      return BST;

      如果是空树,直接申请一个空间,否则则像find一样先比较,找到应该查入在哪一个结点后面之后,进入第一个分支,创建一个结点,挂在上一个结点后面。
      因此不是return Insert(X,BST->Right)
      而是BST->Right=Insert(X,BST->Right),把这个结点连接上一个结点。

    • BinTree Delete(ElementType X,BinTree BST):删除元素。三种情况

      • 叶节点:直接删除,再修改父节点指针置为NULL
      • 有一个孩子的结点:使父节点的指针指向要删除结点的孩子结点
      • 左右都不空:用另一节点替代被删除结点,右子树的最小元素,或左子树的最大元素(这两者一定不是有两个孩子的结点),使二叉搜索树的依然有顺序。
    BinTree Delete(ElementType X,BinTree BST){ Postion Tmp; if(!BST) printf("not found"); else if(X<BST->Data) BST->Left=Delete(X,BST->Left);//左子树递归删除 else if(X>BST->Right) BST->Right=Delete(X,BST->Right);//右子树递归删除 else//找到要删除的结点 if(BST->Left && Bst->Right){//左右两边都不空 Tmp=FindMin(BST->Right);//找到右边最小结点 BST->Data=Tmp->Data;//拷贝复制给当前结点,替代 BST->Right=Delete(BST->Data,BST->Right);//把右子树中的最小结点即Tmp删除 }else{//有一个孩子 Tmp=BST; if(!BST->Left)//左边空 BST=BST->Right; else if(!bst->Right)//右边空 BST=BST->Left; free(Tmp); } return BST; } 

    哦靠,晕了

    4 条回复    2015-05-10 14:49:41 +08:00
    znoodl
        1
    znoodl  
       2015-05-10 12:32:00 +08:00
    我觉得平衡二叉树比这个难,怎么平衡使查询效率高,数据结构算法就是耗脑子的东西
    Reficul
        2
    Reficul  
       2015-05-10 13:06:59 +08:00 via Android
    那会我上这个公开课的时候,只会C,各种边界上出错。简直痛苦。
    feiyuanqiu
        3
    feiyuanqiu  
       2015-05-10 14:26:30 +08:00
    之前看算法的时候,二叉搜索树我觉得还行,挺好理解的,我是倒在 avl 树那里的,根本都想不通旋转是怎么弄的
    zhufree
        4
    zhufree  
    OP
       2015-05-10 14:49:41 +08:00
    @znoodl 都开始怀疑自己智商了OAO
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     921 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:14 PVG 05:14 LAX 13:14 JFK 16:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86