用递归重写已有的程序(四): 前序遍历和中序遍历建立一棵二叉树

本文介绍了一种通过前序和中序遍历来构建二叉树的方法,并提供了具体的C语言实现代码。该方法首先从给定的前序遍历序列中获取根节点,然后根据中序遍历找到根节点的位置,以此划分出左子树和右子树对应的序列,最后递归地构建整棵二叉树。

二叉树是非线性结构,每个结点会有零个、一个或两个孩子结点,一个二叉树的遍历序列不能决定一棵二叉树,但某些不同的遍历序列组合可以惟一确定一棵二叉树。可以证明,给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树的结构

二叉树节点的定义
typedef struct tnode
{
    char data;
    struct tnode *leftChild;
    struct tnode *rightChild;
}BiTreeNode;

BiTreeNode * tree_buld(string pre, string mid)//利用中序,前序遍历建二叉树
{
    if (pre.size() == 0) return NULL;  //空的时候,返回NULL, 递归出口1
    if (pre.size() == 1) {  //只有一个结点,作为根节点
        BiTreeNode *root = (BiTreeNode *)malloc(sizeof(BiTreeNode));
        root->data = pre[0];

        root->leftChild = NULL;//这个不能少
        root->rightChild = NULL;// 这个不能少
        return root;
    }
    BiTreeNode *root = (BiTreeNode *)malloc(sizeof(BiTreeNode)); //创建根节点
    root->data = pre[0];
    int i;
    for (i = 0; i < mid.size(); i++)  //从中序遍历找出根节点
        if (mid[i] == pre[0])
            break;

//构造左右子树的前序中序遍历

    string pre1 =pre.substr(1,i) ;
    string pre2 = pre.substr(i + 1, mid.size());
    string mid1 = mid.substr(0, i);
    string mid2 = mid.substr(i+1, mid.size());

    root->leftChild = tree_buld(pre1,mid1);//递归调用创建左子树
    root->rightChild = tree_buld(pre2,mid2);//递归调用创建右子树
    return root;
}

测试程序:

void tree_test()
{

    string pre = "ABDGCEF", mid = "DGBAECF";
    BiTreeNode *root = tree_buld(pre, mid);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值