先根+中根 创建二叉树

#include<stdio.h>
#include<string.h>
struct node{
    node *left;
    node *right;
    char ch;
    node(){
        left = NULL;
        right = NULL;
        ch = '\0';
    }
};
node *root;
node *restruct(char *pre,char *ino,int len){
    if(len<=0) return NULL;
    char ch = pre[0];
    int p = strchr(ino,ch)-ino+1; //找出左子树的个数+根
    node *cur = new node;
    cur->ch = ch;
    cur->left = restruct(pre+1,ino,p-1);
    cur->right = restruct(pre+p,ino+p,len-p);     //边界问题
    return cur;
}
void post(node *p){
    if(p==NULL) return;
    post(p->left);
    post(p->right);
    printf("%c ",p->ch);
}
int main(){
    char pre[100],ino[100];
    scanf("%s%s",pre,ino);
    root=restruct(pre,ino,strlen(pre));
    post(root);
    return 0;
}
//abc bca
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种树形结构,每个节点最多有两个子节点。C语言可以使用先根序列来建造二叉树先根序列即为先访问根节点,再访问左子树,最后访问右子树的顺序。在建造二叉树时,可以按照先根序列逐个读入节点的值,然后按照先根序列的顺序将它们加入二叉树中。 具体的步骤如下: 1. 读入第一个节点的值,并创建一个二叉树根节点,将该值赋给根节点。 2. 判断下一个节点的值是否小于或等于根节点的值。如果是,则将该节点加入根节点的左子树中;否则将该节点加入根节点的右子树中。 3. 重复步骤2,直到读入所有的节点。 4. 完成建造,得到一棵二叉树。 下面是一段C语言代码示例,用于实现先根序列建造二叉树: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }; struct TreeNode* createTree(int val) { struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } struct TreeNode* insert(struct TreeNode* root, int val) { if (root == NULL) { return createTree(val); } if (val <= root->val) { root->left = insert(root->left, val); } else { root->right = insert(root->right, val); } return root; } struct TreeNode* buildTree(int* preorder, int preorderSize) { struct TreeNode* root = NULL; for (int i = 0; i < preorderSize; i++) { root = insert(root, preorder[i]); } return root; } void printTree(struct TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); printTree(root->left); printTree(root->right); } int main() { int preorder[] = {10, 5, 3, 2, 8, 7, 9, 15, 12, 20}; int preorderSize = sizeof(preorder) / sizeof(preorder[0]); struct TreeNode* root = buildTree(preorder, preorderSize); printf("先根序列建造的二叉树为:\n"); printTree(root); printf("\n"); return 0; } ``` 在该示例中,我们定义了一个结构体`TreeNode`,用于表示二叉树中的节点。`createTree`函数用于创建一个新的节点,并将节点的值赋为参数`val`。`insert`函数用于向二叉树中插入一个新节点,插入过程是按照先根序列的顺序进行的。`buildTree`函数用于建造一棵新的二叉树,它依次读入每个节点的值,并将它们插入到二叉树中。`printTree`函数用于按照先根序列的顺序打印二叉树中的所有节点。 在`main`函数中,我们定义了一个先根序列,并调用`buildTree`函数建造一棵新的二叉树。最后使用`printTree`函数打印这棵二叉树先根序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值