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

来源:互联网 发布:js中join的用法 编辑:程序博客网 时间:2024/05/16 10:03
转载自:http://blog.csdn.net/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;}


                                             
0 0