数据结构——浙大网易云课堂记录(一)树(中篇)

二叉搜索树

利用二叉树搜索树(BST,Binary Search Tree),提高查找效率。设左儿子的节点值<父节点值<右儿子节点值,在树中搜索X,每遇到一个节点,将X 的值和节点值做比较,若X 较小,去左子树继续查找;若X 较大,去右子树继续查找;直至全部节点比较完毕或查找到元素。

查找操作Find
Position Find(ElementType X, BinTree BST){
    if(!BST) return NULL; // 查找失败
    if(X < BST -> Data){
        return Find(BST -> Left);
    }else if(X > BST -> Data){
        return Find(BST -> Right);
    }else{
        return BST; // BST -> Data == X
    }
}

上述方法中有尾递归,即递归的调用出现在函数末尾,本例是在return 语句。可以将尾递归函数更改为迭代函数。

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

如果树“不平衡”,比如所有节点没有右儿子,那么N 个节点构成的数的深度是N-1,此时查找次数达不到理想的log(N)

插入操作Insert
  1. 如果树空,新建节点,给新节点赋值,返回指向该新节点的指针
  2. 如果插入值比根节点小,去左子树插值。
  3. 如果插入值比根节点大,去右子树插值。
BinTree Insert(ElementType X, BinTree BST){
    if(!BST){
        BST = malloc(sizeof(struct TreeNode));
        BST -> Data = X;
        BST ->left = NULL;
        BST -> Right = NULL;
    }else if(X < BST -> Data){
        BST -> Left = Insert(X, BST -> Left);
    }else(X > BST -> Data){
        BST -> Right= Insert(X, BST -> Right);
    }
    return BST;
}

这个函数和搜索有点像,但是多了一个返回值。返回的节点会被赋给父节点的左儿子或右儿子,继而,更新过后(已经插入新节点)的子树会“连”回根节点,一层层向上……

删除操作Delete
  1. 查找到该元素
  2. 分情况
    1.被删的节点是叶节点,直接让它的父节点指向它的指针为null
    2.被删的节点只有一个儿子,,让它的父节点指向它的儿子
    3.被删的节点左右子树都非空,转化为第二种情况:在左子树中找到最大值(没有右儿子)或在右子树中找到最小值(没有左儿子),用最值节点代替被删节点,然后删除最值节点。

平衡二叉树

树的形状影响搜索效率。
定义平衡因子(Balance Factor,BF)BF(T) = hL - hR,其中hLhR 分别是左右子树高度。
平衡二叉树(Balanced Binary Tree,AVL Tree):
空树,或者
任一节点,有|BT(T)| <= 1

平衡二叉树高度

节点数为n,最大高度O(logn),证明:利用斐波那契数列。

平衡二叉树的调整
RR旋转
LL旋转
LR旋转
RL旋转
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容如下: ├─程序例子 │ │ Gauss.cpp │ │ MOVE.C │ │ RUIYUE_3.C │ │ RUIYUE_4.C │ │ │ ├─1概述 │ │ bb_sort.cpp │ │ ex1-9.cpp │ │ ex1-91.cpp │ │ │ ├─2线性表 │ │ ex2-11.cpp │ │ ex2-11new.cpp │ │ linklist.cpp │ │ linklist.h │ │ LINKQUEU.C │ │ linkqueue.cpp │ │ linkqueue.h │ │ list.c │ │ LIST2.C │ │ LIST_S15.C │ │ LIST_SL.C │ │ LIST_SQ.C │ │ LIST_SQ5.C │ │ new2-11.cpp │ │ old2-11.cpp │ │ SQLIST.C │ │ Sqlist.cpp │ │ UNION.CPP │ │ │ ├─3堆栈与队列 │ │ bank_simulation.cpp │ │ conversion.cpp │ │ DMXSTACK.C │ │ hanoi.cpp │ │ MAZE.CPP │ │ QUEUE09.C │ │ SQQUEUE.C │ │ Sqqueue.cpp │ │ sqstack.cpp │ │ stack.c │ │ STK_9.C │ │ 表达式求值.cpp │ │ │ ├─5数组 │ │ array.c │ │ array_ex.cpp │ │ array_test.cpp │ │ DK1.c │ │ DK2.c │ │ SANYANZU.C │ │ │ └─6 │ bitree.cpp │ BITREE11.C │ bitree2.cpp │ BITREE23.C │ BITREE9.C │ Create_bitree.c │ inorder_thr_tree.cpp │ intreading.cpp │ TING6.C │ TRAVERSE.C │ └─课件 sjjg答疑.txt 数据结构1概述.ppt 数据结构2线性表1.ppt 数据结构3线性表2.ppt 数据结构4堆栈与队列1.ppt 数据结构5堆栈与队列2.ppt 数据结构6串.ppt 数据结构7数组1.ppt 数据结构8数组2.ppt 数据结构91.ppt 数据结构A2.ppt 数据结构B3.ppt 数据结构C图1.ppt 数据结构D图2.ppt 数据结构E查找.ppt 数据结构F排序.ppt 数据结构文稿14.ppt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值