建立二叉树

//根据输入的值顺序不同 树不唯一

//输出前序遍历、中序遍历、后序遍历

#include<stdio.h>
#include<string>
//using namespace std;

struct Node{
    Node *lch;
    Node *rch;
    int c;
}tree[101];

int n;//静态内存中已经分配的节点个数
Node *create(){//申请节点空间并返回其指针
    tree[n].lch = tree[n].rch = NULL;
    return &tree[n++];
}

//后序遍历
void postOrder(Node* t){
    if (t->lch != NULL)
    {
        postOrder(t->lch);
    }
    if (t->rch != NULL)
    {
        postOrder(t->rch);
    }
    printf("%d", t->c);
}
//前序遍历
void preOrder(Node*t)
{
    if (t == NULL)return;
    printf("%d", t->c);
    if (t->lch != NULL)
        preOrder(t->lch);
    if (t->rch != NULL)
        preOrder(t->rch);
}

//中序遍历
void midOrder(Node*t)
{
    if (t->lch != NULL)
        midOrder(t->lch);
    printf("%d", t->c);
    if (t->rch != NULL)
        midOrder(t->rch);
}
Node *insert(int num,Node *t){
    if (t == NULL)
    {
        t = create();
        t->c = num;
        return t;
    }
    else if (num > t->c)
    {
        t->rch = insert(num, t->rch);
    }
    else if (num < t->c)
    {
        t->lch = insert(num, t->lch);
    }
    return t;
}


void main()
{
    int num;
    while (scanf("%d", &num)!=EOF)
    {
        
        Node *root=NULL;
        n = 0;
        for (int i = 0; i < num; i++)
        {
            int a;
            scanf("%d", &a);
            root=insert(a, root);
        }
        preOrder(root);
        printf("\n");
        midOrder(root);
        printf("\n");
        postOrder(root);
        printf("\n");
    }
    


}

 

在C语言中,常见的建立二叉树的方法有多种,下面介绍几种典型的方法。 ### 基于链式存储结构,通过前序遍历序列建立二叉树 可以使用链式存储结构来表示二叉树,其节点的定义如下: ```c typedef struct BitNode { char data; struct BitNode* lchild, * rchild; } BitNode, * BiTree; ``` 通过前序遍历序列来创建二叉树的代码示例如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct BitNode { char data; struct BitNode* lchild, * rchild; } BitNode, * BiTree; // 通过前序遍历序列创建二叉树 BiTree createBiTree() { char ch; scanf("%c", &ch); if (ch == '#') { return NULL; } else { BiTree T = (BiTree)malloc(sizeof(BitNode)); T->data = ch; T->lchild = createBiTree(); T->rchild = createBiTree(); return T; } } // 测试代码 int main() { BiTree T = createBiTree(); // 这里可以添加对二叉树的其他操作 return 0; } ``` 在上述代码中,使用 `#` 表示空节点。通过递归的方式,根据前序遍历序列依次创建节点。 ### 基于数组存储结构建立完全二叉树 对于完全二叉树,可以使用数组来存储。假设数组 `tree` 存储二叉树的节点,节点 `i` 的左子节点为 `2 * i + 1`,右子节点为 `2 * i + 2`。 ```c #include <stdio.h> #define MAX_SIZE 100 // 数组存储完全二叉树 char tree[MAX_SIZE]; // 初始化完全二叉树 void initTree() { // 这里可以进行数组元素的赋值操作 // 例如: tree[0] = 'A'; tree[1] = 'B'; tree[2] = 'C'; // ... } // 测试代码 int main() { initTree(); // 这里可以添加对二叉树的其他操作 return 0; } ``` ### 基于中序和前序遍历序列建立二叉树 已知二叉树的中序和前序遍历序列,可以唯一确定一棵二叉树。代码示例如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct BitNode { char data; struct BitNode* lchild, * rchild; } BitNode, * BiTree; // 在中序序列中查找根节点的位置 int findIndex(char in[], int start, int end, char value) { for (int i = start; i <= end; i++) { if (in[i] == value) { return i; } } return -1; } // 根据中序和前序序列创建二叉树 BiTree buildTree(char in[], char pre[], int inStart, int inEnd, int* preIndex) { if (inStart > inEnd) { return NULL; } BiTree T = (BiTree)malloc(sizeof(BitNode)); T->data = pre[(*preIndex)++]; if (inStart == inEnd) { T->lchild = NULL; T->rchild = NULL; return T; } int inIndex = findIndex(in, inStart, inEnd, T->data); T->lchild = buildTree(in, pre, inStart, inIndex - 1, preIndex); T->rchild = buildTree(in, pre, inIndex + 1, inEnd, preIndex); return T; } // 测试代码 int main() { char in[] = {'D', 'B', 'E', 'A', 'F', 'C'}; char pre[] = {'A', 'B', 'D', 'E', 'C', 'F'}; int preIndex = 0; BiTree T = buildTree(in, pre, 0, sizeof(in) / sizeof(in[0]) - 1, &preIndex); // 这里可以添加对二叉树的其他操作 return 0; } ``` 在上述代码中,通过递归的方式,根据前序序列确定根节点,在中序序列中找到根节点的位置,从而划分左右子树,再递归创建左右子树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值