二叉排序树/平衡二叉树/哈夫曼树

本人将树相关知识总结为初、中、高三篇,本文属于树结构的中篇,主要阐述几种经典的树形结构,是继承树的基础知识之后,进行相关拓展那么本文将以三种典型的树形结构进行总结,从查找的角度来进行分析各个树型结构的区别与优势。

基础篇在:数据结构——树基础  (主要总结树、二叉树、线索二叉树、森林等基础相关知识)

二叉排序树

树表相关概念

查找表:查找表是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
关键字:用来标识一个数据元素(或记录)的某个数据项的值
主关键字:可堆一地标识一个记录的关键字是主关键字
次关键字:用以识别若干记录的关键字是次关键字。
查找表的分类:静态查找表仅用作于查询(检索)操作的查找表。如线性表等:动态查找表可以用作于插入删除等操作的表如树表等,常用于数据库等地方。
平均查找长度:ASL(Average Search Length)关键字的平均比较次数。

二叉排序树定义

(二叉搜索树、二叉查找树、BST)

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 
任意节点的左、右子树也分别为二叉查找树; 

二叉排序树的性质:
中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列。 

查找操作

二叉树排序树的存储结构

typedef struct {
	keyType key;    //关键字项,需要与给定的关键字进行对比
	infoType otherinfo: //其他数据项
}ElemType;
typedef struct BSTNode {
	ElemType data;          //数据域(可以包含关键字和其他数据)
	struct BSTNode* Lchild, * Rchild;  //左右孩子指针
}BSTNode,*BSTree;

 查找递归代码

这里注意 T->data.key 为原有的树根结点,而 key 为需要查询的关键字

//递归查找算法
BSTree SearchBST(BSTree T,int key) {  //ksy为新的关键字
	if (!T || T->data.key == key)return T; //递归结束条件T为空或给定关键字与原有关键字相等
	else if (T->data.key < key) return SearchBST(T->Rchild,key); //右子树查找
	else return SearchBST(T->Lchild, key);	//	左子树查找
}

这里的 判断条件 !T || T->data.key == key  中T若为空return返回的是空指针,也可以将这句改成两行代码 即 T为空则返回false,相等则返回T。

查找非递归代码

BSTree SearchBST(BSTree T, int key){
	whil
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
是一种带权路径长度最短的二叉树,用于数据压缩等领域。下面是哈的建立过程: 1. 将所有权值作为叶子结点,构成n棵只有一个结点的二叉树。 2. 从这n棵二叉树中选出两棵根节点权值最小的作为左右子,构造一棵新的二叉树,且新二叉树的根节点权值为左右子根节点权值之和。 3. 将这棵新插入到n棵二叉树中,删除选出的两棵二叉树,得到n-1棵二叉树。 4. 重复2-3步,直到构造出一棵二叉树,即为哈。 下面是代码实现(二链表): ```c++ #include<iostream> #include<queue> using namespace std; // 定义哈节点 struct Node { int weight; // 权值 Node* left; // 左儿子 Node* right; // 右儿子 Node(int w = 0, Node* l = NULL, Node* r = NULL) : weight(w), left(l), right(r) {} }; // 比较函数,用于优先队列中节点的排序 struct cmp { bool operator()(Node* a, Node* b) { return a->weight > b->weight; } }; // 构造哈 Node* buildHuffmanTree(int* weight, int n) { priority_queue<Node*, vector<Node*>, cmp> q; for (int i = 0; i < n; i++) { q.push(new Node(weight[i])); } while (q.size() > 1) { Node* left = q.top(); q.pop(); Node* right = q.top(); q.pop(); Node* parent = new Node(left->weight + right->weight, left, right); q.push(parent); } return q.top(); } // 先序遍历哈 void preOrder(Node* root) { if (root) { cout << root->weight << " "; preOrder(root->left); preOrder(root->right); } } int main() { // 假设有7个权值,分别为1,2,2,3,4,5,6 int weight[] = { 1,2,2,3,4,5,6 }; int n = sizeof(weight) / sizeof(int); Node* root = buildHuffmanTree(weight, n); preOrder(root); // 输出:23 12 6 3 1 2 5 4 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序lee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值