由先序遍历和中序遍历构造二叉树的二叉链表代码

转载自: http://blog.youkuaiyun.com/sunmeng_007/article/details/8095224
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

//定义节点
typedef struct btnode
{
    char value;
    struct btnode *left;
    struct btnode *right;
}btnode;

//该函数的作用是:返回在中序遍历序列数组中根节点的下标
//函数的第一个参数是前序遍历序列数组
//函数的第二个参数是中序遍历序列数组
//函数的第三个参数是前序遍历序列与中序遍历序列的长度
int get_root_idx(char *preorder, char *inorder, int n)
{
    int i;
    char ch;
    //该循环的初始化操作包括了把ch赋值为preorder[]数组的首个元素
    //因为preorder[]的首个元素是根节点
    for(i=0, ch=preorder[0]; i<n; i++)
        if(inorder[i]==ch)
            return i;
    return -1;
}

//根据先序遍历序列和中序遍历序列建立二叉树链表
//btnode *build_from_preorder_and_inorder(前序遍历数组,中序遍历数组, 数组长度)
btnode *build_from_preorder_and_inorder(char *preorder, char *inorder, int n)
{
    //如果表长为0,return NULL
    if(n==0)
        return NULL;
    //根节点的值即为前序遍历数组的第一个元素
    int root_val = preorder[0];
    //找到中序遍历序列数组中根节点的下标
    int i = get_root_idx(preorder, inorder, n);
    //为二叉树链表建立根节点
    btnode *root = (btnode*)malloc(sizeof(btnode));
    //为根节点赋值
    root->value = root_val; 
    
    //构造根节点的左子树
    root->left = build_from_preorder_and_inorder(preorder+1, inorder, i);

    //构造根节点的右子树
    root->right = build_from_preorder_and_inorder(preorder+i+1, inorder+i+1, n-i-1);
    //返回根节点
    return root;
}
//后续遍历打印二叉树链表
void postorder(btnode *root)  
{  
    if(root)  
    {  
        postorder(root->left);  
        postorder(root->right);  
        printf("%c", root->value);  
    }  
}  
int main()
{
    //char *preorder = "ABDEGCFH";
    //char *inorder = "DBEGAHFC";
	//char *preorder = "ABEKLFGMCHDIJ";
    //char *inorder = "KLEFMGBHCIJDA";
    char *preorder = "GCABFED";
    char *inorder = "ACBGDEF";
	int n = strlen(preorder);
    btnode *root = build_from_preorder_and_inorder(preorder, inorder, n);
    postorder(root);
    printf("\n");
    return 0;
}



                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值