用c语言建立一棵二叉树,实现一下功能 先序遍历 中序遍历 后序遍历 求二叉树的深度 求二叉树叶子结点个数
时间: 2024-01-23 13:42:23 浏览: 101
二叉树遍历
好的,我会尽力回答你关于C语言建立二叉树的问题。
在C语言中,可以使用结构体来定义二叉树节点的结构,包括其左右子节点指针和数据值等。以下是示例代码:
```
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
```
接下来,我们可以使用递归的方式来遍历二叉树并实现相关功能,具体代码如下:
```
// 建立二叉树
struct TreeNode* buildTree(int* preorder, int preStart, int preEnd, int* inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = preorder[preStart];
int inIndex = 0; // 找到根节点在中序遍历中的索引位置
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root->val) {
inIndex = i;
break;
}
}
root->left = buildTree(preorder, preStart + 1, preStart + inIndex - inStart, inorder, inStart, inIndex - 1);
root->right = buildTree(preorder, preStart + inIndex - inStart + 1, preEnd, inorder, inIndex + 1, inEnd);
return root;
}
// 先序遍历
void preorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
// 求二叉树的深度
int maxDepth(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return fmax(leftDepth, rightDepth) + 1;
}
// 求二叉树叶子节点个数
int countLeaves(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return 1;
}
return countLeaves(root->left) + countLeaves(root->right);
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6};
int inorder[] = {4, 2, 5, 1, 3, 6};
int n = sizeof(preorder) / sizeof(int);
struct TreeNode* root = buildTree(preorder, 0, n - 1, inorder, 0, n - 1);
printf("先序遍历:");
preorderTraversal(root);
printf("\n中序遍历:");
inorderTraversal(root);
printf("\n后序遍历:");
postorderTraversal(root);
printf("\n二叉树深度:%d\n", maxDepth(root));
printf("叶子节点个数:%d\n", countLeaves(root));
return 0;
}
```
希望这些代码和功能对您有所帮助!
阅读全文