C语言二叉树的基本操作

二叉树在数据管理中应用广泛,现给出二叉树的操作实例以供参考:

/*
给一组数字,按照二叉树层序排布,其中-1表示空节点
*/
#include <cstdio>
#include <cstdlib>
typedef struct _BiTree {
    char num;
    struct _BiTree *left;
    struct _BiTree *right;
} BiTree;

// 创建二叉树
void CreateTree(BiTree **Tree)
{
    char n;
    char temp;
    scanf("%c", &n);
    temp = getchar();
    if (n == '#') {
        (*Tree) = NULL;
    } else {
        (*Tree) = (BiTree)malloc(sizeof(BiTree *));
        (*Tree)->num = n;
        CreateTree(&(*Tree)->left);
        CreateTree(&(*Tree)->right);
    }
    return;
}

// 先序遍历:根-左-右
void FistTraverse(BiTree *Tree)
{
    if (Tree == NULL) {
        return;
    }
    printf("%c", Tree->num);
    FistTraverse(Tree->left);
    FistTraverse(Tree->right);
}

// 中序遍历:左-根-右
void MidTraverse(BiTree *Tree)
{
    if (Tree == NULL) {
        return;
    }
    MidTraverse(Tree->left);
    printf("%c", Tree->num);
    MidTraverse(Tree->right);
}

// 后序遍历:左-右-根
void LastTraverse(BiTree *Tree)
{
    if (Tree == NULL) {
        return;
    }
    LastTraverse(Tree->left);
    LastTraverse(Tree->right);
    printf("%c", Tree->num);
}

// 层序遍历
#define MAXSIZE 50
typedef struct _SqQueue{
    BiTree* date[MAXSIZE];
    int front;//头指针 
    int rear;//尾指针 
} SqQueue;

void InitQueue(SqQueue *Sq)
{
    Sq->front = 0;
    Sq->rear = 0;
}

bool IsSqEmpty(SqQueue Sq)
{
    if (Sq.front == SqQueue.rear) {
        return true;
    } else {
        return false;
    }
}
// 入队
void EnQueue(SqQueue *Sq, BiTree *Tree)
{
    Sq->date[Sq->rear++] = Tree;
}
// 出队
void DeQueue(SqQueue *Sq, BiTree **Temp)
{
    (*Temp) = Sq->date[Sq->front++];
}

void LevelTraverse(BiTree *Tree)
{
    SqQueue Sq;
    BiTree *temp;
    InitQueue(&Sq);
    EnQueue(&Sq, Tree);
    while (!IsSqEmpty(Sq)) {
        DeQueue(&Sq, &temp);
        printf("%c", temp->num);
        if (temp->left) {
            EnQueue(&Sq, temp->left);
        }
        if (temp->right) {
            EnQueue(&Sq, temp->right);
        }
    }
}

// 根据先序+中序创建二叉树,输出后序遍历序列
BiTree CreateBinTreetoBack(char *pre, /* 先序 */
                     char *in,  /* 中序 */
                     int n      /* 序列个数 */)
{
    BiTree *Tree;
    if (n <= 0) {
        return NULL;
    }
    int i;
    Tree = (BiTree *)malloc(sizeof(BiTree));
    Tree->num = pre[0];
    for (i = 0; in[i] != pre[0]; i++);
    Tree->left = CreateBinTreetoBack(pre + 1, in, i);
    Tree->right = CreateBinTreetoBack(pre + i + 1, in + i + 1, n - i - 1);
    return Tree;
}

// 根据后序+中序创建二叉树,输出先序遍历序列
BiTree CreateBinTreetoFront(char *post, /* 后序 */
                     char *in,  /* 中序 */
                     int n      /* 序列个数 */)
{
    BiTree *Tree;
    if (n <= 0) {
        return NULL;
    }
    int i;
    Tree = (BiTree *)malloc(sizeof(BiTree));
    Tree->num = post[n - 1];
    for (i = 0; in[i] != post[n - 1]; i++);
    Tree->left = CreateBinTreetoFront(post, in, i);
    Tree->right = CreateBinTreetoFront(post + i, in + i + 1; n - i - 1);
    return Tree;
}
// 复制二叉树
int CopyTree(BiTree **NewTree, BiTree *Tree)
{
    if (Tree == NULL) {
        (*NewTree) = NULL;
        return 0;
    } else {
        (*NewTree) = (BiTree *)malloc(sizeof(BiTree));
        (*NewTree)->num = Tree->num;
        CopyTree(&(*NewTree)->left, Tree->left);
        CopyTree(&(*NewTree)->right, Tree->right);
    }
}
// 计算二叉树深度 前序遍历
int depth;
void DepthTreeFront(BiTree *Tree, int tempDepth)
{
    if (Tree == NULL) {
        return;
    }
    if (Tree->left == NULL && Tree->right == NULL) {
        depth = fmax(tempDepth, depth);
    }
    DepthTreeFront(Tree->left, tempDepth + 1);
    DepthTreeFront(Tree->right, tempDepth + 1);
}
// 计算二叉树深度 后序遍历
int DepthTree(BiTree *Tree)
{
    int m, n;
    if (Tree == NULL) {
        return 0;
    } else {
        m = DepthTree(Tree->left);
        n = DepthTree(Tree->right);
        if (m > n) {
            return (m + 1);
        } else {
            return (n + 1);
        }
    }
}

// 计算二叉树结点个数
int NodeCountTree(BiTree *Tree)
{
    if (Tree == NULL) {
        return 0;
    } else {
        return NodeCountTree(Tree->left) + NodeCountTree(Tree->right) + 1;
    }
}

// 计算二叉树叶子结点数
int LeavesCountTree(BiTree *Tree)
{
    if (Tree == NULL) {
        return 0;
    }
    if (Tree->left == NULL && Tree->right == NULL) {
        return 1;
    } else {
        return LeavesCountTree(Tree->left) + LeavesCountTree(Tree->right);
    }
}

// 释放
void FreeTree(BiTree **Tree)
{
    BiTree *temp = (*Tree);
    if ((*Tree) == NULL) {
        return;
    }
    FreeTree(&(*Tree)->left);
    FreeTree(&(*Tree)->right);
    free((*Tree));
    (*Tree) = NULL;
}

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

#define MAX_NUM 2000
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes)
{
    if (root == NULL) {
        *returnSize = 0;
        return NULL;
    }
    int **ret = (int **)malloc(sizeof(int *) * MAX_NUM);
    memset(ret, 0, sizeof(int *) * MAX_NUM);
    *returnColumnSizes = (int *)malloc(sizeof(int) * MAX_NUM); // 存储返回的二维数组每一行元素个数
    int head = 0;
    int tail = 0;
    struct TreeNode *queue[MAX_NUM] = {0};
    queue[tail++] = root;
    int level = 0; // 二叉树层数
    while (head < tail) {
        int len = tail - head;
        (*returnColumnSizes)[level] = len;
        ret[level] = (int *)malloc(sizeof(int) * len);
        for (int i = 0; i < len; i++) {
            struct TreeNode *temp = queue[head++];
            if (temp == NULL) {
                continue;
            }
            ret[level][i] = temp->val;
            if (temp->left) {
                queue[tail++] = temp->left;
            }
            if (temp->right) {
                queue[tail++] = temp->right;
            }
        }
        level++;
    }
    *returnSize = level;
    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小朋友的大哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值