利用前序遍历构建二叉树(C语言)

#include<stdio.h>
#include<stdlib.h>
struct TreeNode{
    char data;
    struct TreeNode *left;
    struct TreeNode *right;
};
struct TreeNode *create_by_pre(struct TreeNode *T){/*利用前序遍历构建二叉树*/
    char ch;
    printf("ch=");
    scanf("%c",&ch);
    getchar();
    if(ch=='#'){
        T=NULL;
    }else{
        T=(struct TreeNode *)malloc(sizeof(struct TreeNode));
        T->data=ch;
        T->left=create_by_pre(T->left);
        T->right=create_by_pre(T->right);
    }
    return T;
}
void preOrder(struct TreeNode *T){
    if(T!=NULL){
        printf("\t%c",T->data);
        preOrder(T->left);
        preOrder(T->right);
    }
}
void inOrder(struct TreeNode *T){
    if(T!=NULL){
        inOrder(T->left);
        printf("\t%c",T->data);
        inOrder(T->right);
    }
}
void postOrder(struct TreeNode *T){
    if(T!=NULL){
        postOrder(T->left);
        postOrder(T->right);
        printf("\t%c",T->data);
    }
}
int main(){
    struct TreeNode *T;
    T=NULL;
    T=create_by_pre(T);
    printf("前序遍历:");
    preOrder(T);
    printf("\n中序遍历:");
    inOrder(T);
    printf("\n后序遍历:");
    postOrder(T);
    return 0;
}

 

 

  • 19
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
以下是由前序遍历和后序遍历构建二叉树C语言代码: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* buildTreeHelper(int* preorder, int preStart, int preEnd, int* inorder, int inStart, int inEnd, int* postorder, int postStart, int postEnd) { if (preStart > preEnd || inStart > inEnd || postStart > postEnd) { 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; } } int leftTreeSize = inIndex - inStart; int rightTreeSize = inEnd - inIndex; root->left = buildTreeHelper(preorder, preStart + 1, preStart + leftTreeSize, inorder, inStart, inIndex - 1, postorder, postStart, postStart + leftTreeSize - 1); root->right = buildTreeHelper(preorder, preStart + leftTreeSize + 1, preEnd, inorder, inIndex + 1, inEnd, postorder, postStart + leftTreeSize, postEnd - 1); return root; } struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize, int* postorder, int postorderSize) { return buildTreeHelper(preorder, 0, preorderSize - 1, inorder, 0, inorderSize - 1, postorder, 0, postorderSize - 1); } void printTree(struct TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); printTree(root->left); printTree(root->right); } int main() { int preorder[] = {1, 2, 4, 5, 3, 6, 7}; int inorder[] = {4, 2, 5, 1, 6, 3, 7}; int postorder[] = {4, 5, 2, 6, 7, 3, 1}; int size = sizeof(preorder) / sizeof(preorder[0]); struct TreeNode* root = buildTree(preorder, size, inorder, size, postorder, size); printf("前序遍历结果:"); printTree(root); printf("\n"); return 0; } ``` 这里假设前序遍历为preorder,后序遍历为postorder,中序遍历为inorder。函数buildTreeHelper()用于构建二叉树,其中preStart和preEnd表示当前前序遍历序列的起始和结束位置,inStart和inEnd表示当前中序遍历序列的起始和结束位置,postStart和postEnd表示当前后序遍历序列的起始和结束位置。在函数中,首先根据前序遍历序列的第一个元素创建根节点root,然后在中序遍历序列中查找到root的位置inIndex,进而计算出左子树的大小leftTreeSize和右子树的大小rightTreeSize。接下来,分别递归构建左子树和右子树,并将根节点的左右子树指针指向左右子树的根节点。最后,返回根节点。函数buildTree()是对buildTreeHelper()的包装,传入前序遍历序列、中序遍历序列、后序遍历序列的起始位置和大小。函数printTree()用于前序遍历打印二叉树,方便验证结果。主函数中定义了三个遍历序列,通过buildTree()创建二叉树并打印前序遍历结果。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值