美文网首页
二叉树的创建和遍历

二叉树的创建和遍历

作者: PersisThd | 来源:发表于2019-07-07 14:58 被阅读0次

1、头文件BiTree.h

#include <stdio.h>

typedef struct BiTNode
{
    char data;
    struct BiTNode* lChild;
    struct BiTNode* rChild;
}BiTNode;

void PreOrderTraverse(BiTNode*);
void InorderTraverse(BiTNode*);
void PostOrderTraverse(BiTNode*);
BiTNode* CreateTree();
void NumOfLeafNode(BiTNode*, int*);
int GetHight(BiTNode*);
BiTNode* CopyTree(BiTNode*);
void DestroyTree(BiTNode*);

2、相关操作函数文件BiTree.c

#include <stdio.h>
#include <stdlib.h>
#include "BiTree.h"

void PreOrderTraverse(BiTNode* T)
{
    if(T == NULL)
    {
        return;
    }
    printf("%c", T->data);
    PreOrderTraverse(T->lChild);
    PreOrderTraverse(T->rChild);
}

void InorderTraverse(BiTNode* T)
{
    if(T == NULL)
    {
        return;
    }
    InorderTraverse(T->lChild);
    printf("%c", T->data);
    InorderTraverse(T->rChild);
}

void PostOrderTraverse(BiTNode* T)
{
    if(T == NULL)
        return;

    PostOrderTraverse(T->lChild);
    PostOrderTraverse(T->rChild);
    printf("%c", T->data);
}

//#号法创建树
BiTNode* CreateTree()
{
    char ch;
    scanf("%c", &ch);

    //递归结束条件
    if(ch == '#')
        return NULL;

    BiTNode* root = (BiTNode*)malloc(sizeof(BiTNode));

    root->data = ch;
    root->lChild = CreateTree();
    root->rChild = CreateTree();

    return root;
}

//求二叉树的叶子节点数目
void NumOfLeafNode(BiTNode* T, int* n)
{
    if(T == NULL)
        return;

    NumOfLeafNode(T->lChild, n);
    NumOfLeafNode(T->rChild, n);

    if(T->lChild == NULL && T->rChild == NULL)
    {
        (*n)++;
    }
}

//求二叉树的高度
int GetHight(BiTNode* T)
{
    if(T == NULL)
        return 0;

    int h = 0;
    int left = GetHight(T->lChild);
    int right = GetHight(T->rChild);

    h = left > right ? left : right;

    return h + 1;
}

//拷贝二叉树
BiTNode* CopyTree(BiTNode* T)
{
    if(T == NULL)
        return NULL;

    BiTNode* Tnew = (BiTNode*)malloc(sizeof(BiTNode));
    Tnew->data = T->data;
    Tnew->lChild = CopyTree(T->lChild);
    Tnew->rChild = CopyTree(T->rChild);

    return Tnew;
}

//销毁二叉树
void DestroyTree(BiTNode* T)
{
    if(T == NULL)
        return;
    //必须以后序遍历的方式进行销毁,因为要保证每棵子树的根结点最后被释放
    DestroyTree(T->lChild);
    DestroyTree(T->rChild);
    printf("当前释放结点值为:%c\n", T->data);

    free(T);
}

3、主函数main.c

#include <stdio.h>
#include <stdlib.h>
#include "BiTree.h"

int main()
{
    printf("请输入用于#号法创建树的字符串:\n");

    BiTNode* T;
    T = CreateTree();

    printf("\n先序遍历:\n");
    PreOrderTraverse(T);

    printf("\n中序遍历:\n");
    InorderTraverse(T);

    printf("\n后序遍历:\n");
    PostOrderTraverse(T);
    printf("\n");

    int n = 0;
    NumOfLeafNode(T, &n);
    printf("该二叉树叶子结点数目为:%d\n", n);

    int h = GetHight(T);
    printf("该二叉树的高度为:%d\n", h);

    BiTNode* T1 = CopyTree(T);
    printf("中序遍历新拷贝的二叉树:\n");
    InorderTraverse(T1);
    printf("\n");

    printf("销毁二叉树T1:\n");
    DestroyTree(T);

    return 0;
}

相关文章

  • 二叉树的创建和遍历

    二叉树的创建和遍历 如图所示的二叉树,我们用C++来实现其创建和...

  • 数据结构

    编写了数据结构的二叉树的创建和遍历程序

  • 二叉树

    二叉树的创建和遍历都可以通过递归实现 三种遍历方式的记忆:前序遍历 根节点==》左节点==》右节点中序遍历 ...

  • 二叉树常见操作的 C++ 实现(二)

    接着之前的内容,本节继续讲述二叉树中常见操作的 C++ 实现。 上节,我们介绍并实现了二叉树的按前序遍历创建和递归...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

网友评论

      本文标题:二叉树的创建和遍历

      本文链接:https://www.haomeiwen.com/subject/ejibhctx.html