c/c++实现二叉树的创建以及前中后序遍历

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

遍历方式

前序遍历:root -> left -> right
中序遍历:left -> root -> right
后续遍历:left ->right -> root

思路:

利用结构体替代二叉树,并利用递归的思想构建二叉树以及遍历。
因为先序序列和中序序列可以确定唯一的一个二叉树,利用这一思想,构建数组a和数组b,并且a为二叉树的先序序列,b为二叉树的中序序列。利用先序序列确定根,而中序序列确定左右的思想,每次先从a中找到一个根,在对应的b数组中找到根所对应的位置,再进行递归。下面给出思路图解。

思路图解

在这里插入图片描述
在这里插入图片描述

实现代码

#include <iostream>

using namespace std;

typedef struct btNode
{
    int val;
    struct btNode *lchild;
    struct btNode *rchild;
} BTNode;

BTNode *CreateBTree(int a[], int b[], int n)
{ //先序序列,中序序列,共有多少个元素
    if (n <= 0)
        return NULL;
    int root = a[0]; //由先序序列确定根节点
    BTNode *bt = (BTNode *)malloc(sizeof(BTNode));
    bt->val = root;
    int i;
    for (i = 0; i < n; i++)
    {
        if (b[i] == root)
        {
            break;
        }
    }
    bt->lchild = CreateBTree(a + 1, b, i);
    bt->rchild = CreateBTree(a + i + 1, b + i + 1, n - i - 1);
    return bt;
}

//先序遍历
void preorderTraversal(BTNode *r)
{
    if (r == NULL)
        return;
    cout << r->val << "->";
    preorderTraversal(r->lchild);
    preorderTraversal(r->rchild);
}

//中序遍历
void middleorderTraversal(BTNode *r)
{
    if (r == NULL)
        return;
    middleorderTraversal(r->lchild);
    cout << r->val << "->";
    middleorderTraversal(r->rchild);
}

//后序遍历
void postorderTraversal(BTNode *r)
{
    if (r == NULL)
        return;
    postorderTraversal(r->lchild);
    postorderTraversal(r->rchild);
    cout << r->val << "->";
}

int main()
{
    int a[] = {1, 2, 4, 5, 3, 6, 7}; //二叉树 先序序列
    int b[] = {4, 2, 5, 1, 6, 3, 7}; //二叉树 中序序列

    BTNode *bt = CreateBTree(a, b, 7);
    cout<<"The preOrderTraversal is: ";
    preorderTraversal(bt);
    cout << endl;
    cout<<"The middleorderTraversal is: ";
    middleorderTraversal(bt);
    cout << endl;
    cout<<"The postorderTraversal is: ";
    postorderTraversal(bt);
    cout << endl;

    system("pause");
    return 0;
}

运行结果

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值