头歌实训数据结构与算法-二叉树及其应用(第1关:括号表示法创建二叉树)

任务描述


本关任务:给出一棵二叉树的括号表示法,本题要求实现3个函数,根据给出的括号表示法创建该二叉树并输出。输出时,也按二叉树的括号表示法输出。然后再求出二叉树高度并输出。

相关知识


二叉树的括号表示法如图所示:

上面5棵二叉树中,从左至右,每棵二叉树的括号表示法依次为:A,A(B,C),A(B(D),C),A(B(,D),C(E)),A(B(D,E),C(F,G))。

编程要求
代码窗口中给出了二叉树类型定义文件binary_tree.h和实现文件binary_tree.cpp。您的任务是根据提示,在右侧编辑器补充代码,完成给定的3个函数。函数声明如下:

// 利用二叉树的括号表示法创建二叉树root
// 参数:二叉树的根结点指针root。
// 参数:二叉树的括号表示法字符串s。
void CreateTree(BTNode* &root, ElemType* s);
//以嵌套括号表示法输出一棵树
void DispTree(BTNode* root);
// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root);

测试说明
平台会对你编写的代码进行测试:

输入样例1:
A(B(D),C)

(对应二叉树如下)


输出样例1:
A(B(D),C)
3

输入样例2:
A(B(,D),C(E))

(对应二叉树如下)


输出样例2:
A(B(,D),C(E))
3

开始你的任务吧,祝你成功!

测试代码: 

#include "binary_tree.h"

//根据嵌套括号表示法的字符串生成链式存储的二叉树
void CreateTree(BTNode* &root, char str[]) {
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/

	/******END******/
}

//以嵌套括号表示法输出一棵二叉树
void DispTree(BTNode* root) {
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/

	/******END******/
}

// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root)
{
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/

	/******END******/
}
 

 

补充代码: 

#include "binary_tree.h"

//根据嵌套括号表示法的字符串生成链式存储的二叉树
void CreateTree(BTNode* &root, char str[]) {
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/
    BTNode* St[60], * p; root = NULL;
	int top = -1, k, i = 0;	//栈顶指针
	char ch = str[i];
	while (ch != '\0'){
		switch (ch){
		case '(':top++; St[top] = p; k = 1; break;		
		case ')':top--;  break;							
		case ',': k = 2; break;							
		default:
			p = (BTNode*)malloc(sizeof(BTNode));		
			p->data = ch;								
			p->lchild = p->rchild = NULL;				
			if (root == NULL)				
				root = p;			
			else{
                k == 1 ? St[top]->lchild = p : St[top]->rchild = p;
			}
		}
		ch = str[++i];
	}

	/******END******/
}

//以嵌套括号表示法输出一棵二叉树
void DispTree(BTNode* root) {
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/
    if (root != NULL){
		printf("%c", root->data);
		if (root->lchild != NULL || root->rchild != NULL){
			printf("(");
			DispTree(root->lchild);
			if (root->rchild != NULL)
				printf(",");
			DispTree(root->rchild);
			printf(")");
		}
	}
	/******END******/
}

// 求二叉树的高度
// 参数:二叉树根节点root
int getHeight(BTNode* root)
{
	/*请在BEGIN和END之间实现你的代码*/
	/*****BEGIN*****/
    int lchildh, rchildh;
	if (root == NULL) return 0;
	else{
		lchildh = getHeight(root->lchild);
		rchildh = getHeight(root->rchild);
		return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
	}
	/******END******/
}
 

 

### 于哈夫曼树数据压缩算法的编程题目实训内容 #### 哈夫曼树简介 哈夫曼树是一种用于实现最优前缀码编码方案的二叉树结构。它通过最小化加权路径长度来优化数据存储效率,广泛应用于文件压缩领域[^1]。 #### 编程题目描述 以下是基于哈夫曼树的数据压缩算法的一个典型编程题目: **题目名称**: 实现基于哈夫曼树的数据压缩解压 **目标**: 构建一个程序,能够完成以下功能: 1. 给定一段字符串输入,统计其中各字符出现的频率。 2. 使用这些频率构建一棵哈夫曼树。 3. 利用该哈夫曼树生成对应的哈夫曼编码表。 4. 对原始字符串进行编码并输出压缩后的比特流表示形式。 5. 提供解压功能,验证压缩和解压的一致性。 **提示**: 可以采用优先队列辅助构建哈夫曼树的过程,具体逻辑如下所示: ```python import heapq from collections import defaultdict, namedtuple class HuffmanNode(namedtuple("HuffmanNode", ['char', 'freq', 'left', 'right'])): def __lt__(self, other): return self.freq < other.freq def build_huffman_tree(frequency_map): priority_queue = [] for char, freq in frequency_map.items(): node = HuffmanNode(char=char, freq=freq, left=None, right=None) heapq.heappush(priority_queue, node) while len(priority_queue) > 1: left_node = heapq.heappop(priority_queue) right_node = heapq.heappop(priority_queue) merged_freq = left_node.freq + right_node.freq internal_node = HuffmanNode( char=None, freq=merged_freq, left=left_node, right=right_node ) heapq.heappush(priority_queue, internal_node) return priority_queue[0] def generate_codes(node, prefix="", code_table={}): if node is not None: if node.char is not None: code_table[node.char] = prefix generate_codes(node.left, prefix + "0", code_table) generate_codes(node.right, prefix + "1", code_table) return code_table # 测试函数 if __name__ == "__main__": input_string = "this is an example of a huffman tree" frequency_map = defaultdict(int) for char in input_string: frequency_map[char] += 1 root = build_huffman_tree(frequency_map) codes = generate_codes(root) print(codes) ``` 上述代码实现了从给定字符串到哈夫曼树及其对应编码表的核心过程。 #### 训练建议 为了更好地掌握哈夫曼树的应用场景和技术细节,可以尝试以下扩展练习: - **动态调整**: 设计一种机制,在运行过程中实时更新字符频次分布,并重新计算最佳编码方式。 - **性能评估**: 针对不同类型的文本(如英文文章、源代码片段),分析其压缩率差异以及时间复杂度表现。 - **错误处理**: 考虑当输入为空或其他特殊情况下的鲁棒性设计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值