#include <stdio.h>#include <stdlib.h>#include <string.h>/* 二叉树节点 */typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right;} TreeNode;/* 根据先序序列和中序序列构建二叉树 */TreeNode *buildTree(char *preorder, char *inorder, int preStart, int preEnd, int inStart, int inEnd) { // 先序序列为空,返回NULL if (preStart > preEnd) { return NULL; } // 创建根节点 TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode)); root->val = preorder[preStart]; root->left = root->right = NULL; // 在中序序列中查找根节点的位置 int rootIndex; for (rootIndex = inStart; rootIndex <= inEnd; rootIndex++) { if (inorder[rootIndex] == root->val) { break; } } // 计算左子树的节点个数 int leftSize = rootIndex - inStart; // 递归构建左子树和右子树 root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootIndex - 1); root->right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, rootIndex + 1, inEnd); return root;}/* 输出二叉树的后序序列 */void postorderTraversal(TreeNode *root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%c", root->val);}int main() { char preorder[] = "ABDEGCHF"; char inorder[] = "DBEGAHCF"; // 构建二叉树 TreeNode *root = buildTree(preorder, inorder, 0, strlen(preorder) - 1, 0, strlen(inorder) - 1); // 输出二叉树的后序序列 printf("The postorder traversal of the binary tree is: "); postorderTraversal(root); printf("\n"); return 0;}
时间: 2024-03-25 17:39:43 浏览: 71
二叉树的层序创建和后续遍历(代码实现)
这段代码看起来已经很简洁了,不过有一些小的优化可以考虑:
1. 函数参数可以增加 const 修饰符,表示函数不会修改参数的值,这样可以提高代码的可读性和安全性。
2. 二叉树节点结构体可以使用 typedef 来定义,这样代码更加简洁。
3. 开辟内存空间时可以使用 calloc 函数,这样可以避免忘记初始化为 0。
4. 在循环中使用前置自增运算符可以提高代码的效率。
5. 在代码中可以添加注释,提高代码的可读性。
下面是优化后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 二叉树节点 */
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
/* 根据先序序列和中序序列构建二叉树 */
TreeNode *buildTree(const char *preorder, const char *inorder, const int preStart, const int preEnd, const int inStart, const int inEnd) {
// 先序序列为空,返回NULL
if (preStart > preEnd) {
return NULL;
}
// 创建根节点
TreeNode *root = (TreeNode *) calloc(1, sizeof(TreeNode));
root->val = preorder[preStart];
root->left = NULL;
root->right = NULL;
// 在中序序列中查找根节点的位置
int rootIndex = inStart;
while (inorder[rootIndex] != root->val) {
++rootIndex;
}
// 计算左子树的节点个数
const int leftSize = rootIndex - inStart;
// 递归构建左子树和右子树
root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootIndex - 1);
root->right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, rootIndex + 1, inEnd);
return root;
}
/* 输出二叉树的后序序列 */
void postorderTraversal(const TreeNode *root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%c", root->val);
}
int main() {
const char preorder[] = "ABDEGCHF";
const char inorder[] = "DBEGAHCF";
// 构建二叉树
TreeNode *root = buildTree(preorder, inorder, 0, strlen(preorder) - 1, 0, strlen(inorder) - 1);
// 输出二叉树的后序序列
printf("The postorder traversal of the binary tree is: ");
postorderTraversal(root);
printf("\n");
return 0;
}
```
阅读全文