用c语言编写树和二叉树要满足一下要求: 1、输入字符序列,建立二叉树。 2、中序遍历二叉树:递归算法。 3、中序遍历二叉树:非递归算法。 4、综合训练:为N个权值设计哈夫曼编码。
时间: 2024-12-23 19:23:56 浏览: 4
中序遍历递归算法-数据结构(清华大学版)——树和二叉树
在C语言中编写树和二叉树,特别是满足您列出的要求,可以分为几个步骤:
1. **输入字符序列创建二叉树**:
- 使用结构体表示节点,包含字符数据和左右指针。
- 当输入字符序列时,你可以通过迭代或递归的方式构建二叉搜索树(BST),例如每个字符作为节点,左孩子小于当前字符,右孩子大于当前字符。
```c
typedef struct TreeNode {
char data;
struct TreeNode *left, *right;
} Node;
```
- 可以先创建一个空树,然后每次读取一个字符,与根节点比较并插入到相应的位置。
2. **中序遍历二叉树(递归)**:
- 中序遍历顺序是左-根-右,对于每一个节点,先访问左子树,然后访问自身,最后访问右子树。
```c
void inorder(Node* root) {
if (root != NULL) {
inorder(root->left);
printf("%c ", root->data); // 输出当前节点
inorder(root->right);
}
}
```
3. **中序遍历二叉树(非递归)**:
- 需要借助栈数据结构,将左子树所有节点压入栈,然后处理当前节点,接着弹出栈顶元素并继续处理其右子树,直到栈为空。
```c
void inorder_iterative(Node* root) {
stack<Node*> s;
Node* curr = root;
while (curr || !s.empty()) {
while (curr) {
s.push(curr);
curr = curr->left;
}
curr = s.top();
s.pop();
printf("%c ", curr->data);
curr = curr->right;
}
}
```
4. **哈夫曼编码**:
- 综合训练中,为N个权值设计哈夫曼树,首先对每个权值创建一个节点,然后用贪心算法合并频率最低的两个节点形成新节点,并更新频率。这个过程持续到只剩下一个节点为止。
- 最终生成的哈夫曼树可以用于压缩数据,每个字符都有一个对应的编码。
阅读全文