用先根序列和中根序列创建二叉树

本文详细阐述了如何利用二叉树的先根序列和中根序列创建二叉树的过程,包括算法的时间复杂度、空间复杂度分析,以及具体的程序代码实现。该算法的时间复杂度为O(n^2),空间复杂度为O(n),通过递归方式高效地实现了二叉树的重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:二叉树的先根序列和中根序列,用两个数组preorder和inorder存放,先根序列的第一个元素值preorder[0]应为二叉树的根上的元素值,在另一个数组中查到此值,设为inorder[k]。此时,数组preorder中从preorder[1]到preorder[k]的序列(长度为k)和数组inorder中从inorder[0]到inorder[k-1](长度为k)的序列,恰好分别是根结点左子树的先根序列和中根序列;数组preorder中从preorder[k+1]到preorder[n-1]的序列(长度为n-k-1)和数组inorder中从inorder[k+1]到inorder[n-1](长度为n-k-1)的序列,恰好分别是根结点右子树的先根序列和中根序列。根据上述分析,先创建根结点,在递归调用自己两次来分别创建左右子树。

时间复杂度:最坏的情况是,每个非叶结点只有左子树,这是两个数组之间需要比较n+(n-1)+---+1=O(n2)次。所以,该算法时间代价为O(n2)。

空间复杂度:存放二叉树的空间O(n)和用于递归调用的栈空间(不超过O(n))。

程序代码:

  int create_BTree(PBinTree pbtree,DataType * preorder,DataType * InOrder,int n)

  {

    int i,k;

    int tag1,tag2;

    if(n == 0)

    {

      *pbtree = NULL;

      return TRUE;

    }

    for(i = 0;i<n;i++)

      if(inorder[i] == preorder[0])

        break;

    if(i == n)

    {

      *pbtree = NULL;      

      return FALSE;      //输入的先根序列或中根序列有误,创建失败

    }

    k = i;

    *pbtree = (PBinTreeNode)malloc(sizeof(struct BinTreeNode));  

    (*pbtree)->info = preorder[0];

    tag1 = create_BTree(&(*pbtree)->llink,preorder+1,inorder,k);   //递归调用本算法创建左子树

    tag2 = create_BTree(&(*pbtree)->rlink,preorder+k+1,inorder+k+1,n-k-1);  //递归调用本算法创建右子树

    if(tag1 == TRUE && tag2 == TRUE)

      return TRUE;

    return FALSE;

  }

转载于:https://www.cnblogs.com/maomaohhmm/archive/2012/09/10/2679451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值