树和二叉树的应用


一、二叉排序树
1.定义:
1)左子树上所有结点关键字小于根结点关键字
2)右子树上所有结点关键字大于根结点关键字
3)左、右子树又分别是一棵二叉排序树
对其中序遍历可得到一个递增的有序序列
2.查找
从根结点开始比较,小于父结点比较左子树,大于父结点比较右子树,直到有相等时查找成功,返回空时不存在
node *serch(BiTree T, int key, node *&p){
  p = NULL;
  while(T != NULL && key != T->data){
    p = T;
    if(key < T->daty) T = T->lchild;

    else T = T->rchild;

  }

  return T;
}
3.二叉排序树插入
若原二叉排序树为空,直接插入结点;若关键字小于根结点关键字,插入到左子树中,若大于根结点关键字,插入到右子树中。
int Insert(BiTree &T, KeyType k){
  if(NULL == T){
    T=(BiTree)malloc(sizeof(Node));
    T->key = k;
    T->lchild = T->rchild = NULL;
    return 1; //插入成功
  }
  else if(k == T->key)
    return 0;//存在相同的关键字
  else if(k < T->key)
    return Insert(T->lchild, k);
  else 
    return Insert(T->rchild, k);
}
插入的结点一定是叶结点
4.二叉排序树的构造
将数据依次插入到二叉排序树中
void creat(BiTree &T, char str[], int n){
  T = NULL;
  int i = 0;
  while(i < n){
    Insert(T,str[i]);
  i++;
  }
}
5.二叉排序树的删除
删除操作包括三种操作:
1)如果是叶子结点直接删除
2)如果只存在一个子树,由子树代替父结点的位置
3)如果左子树和右子都存在,由右子树上找中序第一个子女代替

二、平衡二叉树
1.定义
任意结点的左、右子树高度差不超过1,简称平衡树
2.平衡二叉树的插入
先找到离插入结点最近的平衡因子绝对值大于1的结点,再对其子树调整位置关系,重新达到平衡

3.平衡二叉树找查找
查找过程与二叉排序树相同。n个结点平衡二次树最大深度为O(log2n),因此平均查找长度为O(log2 n)

三、哈夫曼树和哈夫曼编码
1.定义

带树路径长度最小的二叉树为啥夫曼树。路径长度与权值的乘积为该结点带权路径长度
2.构造过程:
1)将N个结点拆分成N个森林
2)森林中选取两上权值最小的结点作为新结点的左右子树,新结点权值为两子树之和
3)将刚选出的两子树删除,新合成子树加入
4)重复2、3步骤,直到剩下一棵树为止
3.哈夫曼编码
对高频字符赋以短编码,对低频字符赋以长编码
可以设计出总长度最短的二进制前缀编码


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leonban

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值