根据先序和中序序列重建二叉树(打印二叉树的后序序列)

叁歲伎倆 2022-04-15 06:52 242阅读 0赞

1.重建条件

我们知道,要重建二叉树,必须得有中序序列,有了中序,才可以划分出根结点的左子树和右子树。

而由先序和后序可以很容易确定根结点,因此,先序和中序或者后序和中序可以唯一确定二叉树。

此处运用递归的方法,仅以先序和中序序列为代表,给出重建二叉树的代码,供大家参考。

2.核心代码

  1. //根据先序和中序重建二叉树,pre和mid分别指向先序和中序序列,n为结点总数
  2. BiTree BuildTree(char *pre,char *mid,int n)
  3. {
  4. if(n==0)
  5. return error;
  6. BiTree T=(BiTree)malloc(sizeof(BiNode));
  7. if(!T) exit(overflow);
  8. //T是根结点,pre[0]即先序第一个元素就是根结点的数据域
  9. T->data=pre[0];
  10. int i;
  11. //在中序序列中找出根结点的位置,记作i
  12. for(i=0;i<n;i++)
  13. {
  14. if(mid[i]==pre[0]) break;
  15. }
  16. //若中序序列中mid[i]是根结点,则左子树共有i个结点,在先序中从pre+1开始
  17. T->lchild=BuildTree(pre+1,mid,i);
  18. //右子树共有n-i-1个结点,在先序中从pre+i+1开始
  19. T->rchild=BuildTree(pre+i+1,mid+i+1,n-i-1);
  20. return T;//返回根结点
  21. }

3.完整代码

后序遍历上篇写过,在此不做赘述。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //由先序序列和中序序列重建二叉树
  4. #define ok 1
  5. #define error 0
  6. #define overflow -2
  7. typedef int Status;
  8. typedef char TElemType;
  9. typedef struct BiNode{
  10. TElemType data;
  11. struct BiNode *lchild,*rchild;
  12. }BiNode,*BiTree;
  13. BiTree BuildTree(char *pre,char *mid,int n)
  14. {
  15. if(n==0)
  16. return error;
  17. BiTree T=(BiTree)malloc(sizeof(BiNode));
  18. if(!T) exit(overflow);
  19. T->data=pre[0];
  20. int i;
  21. for(i=0;i<n;i++)
  22. {
  23. if(mid[i]==pre[0]) break;
  24. }
  25. //若中序序列中mid[i]是根结点,则左子树共有i个结点,在先序中从pre+1开始
  26. T->lchild=BuildTree(pre+1,mid,i);
  27. //右子树共有n-i-1个结点,在先序中从pre+i+1开始
  28. T->rchild=BuildTree(pre+i+1,mid+i+1,n-i-1);
  29. return T;
  30. }
  31. //后序遍历
  32. Status PostOrderTraverse(BiTree T)
  33. {
  34. if(T)
  35. {
  36. PostOrderTraverse(T->lchild );
  37. PostOrderTraverse(T->rchild );
  38. printf("%c",T->data);
  39. }
  40. return ok;
  41. }
  42. int main(){
  43. char pre[20],mid[20];
  44. int n;
  45. printf("请输入结点总数:\n");
  46. scanf("%d",&n);
  47. printf("请依次输入先序序列和中序序列:\n");
  48. scanf("%s",pre);
  49. scanf("%s",mid);
  50. BiTree T=BuildTree(pre,mid,n);
  51. printf("后序序列为:\n");
  52. PostOrderTraverse(T);
  53. printf("\n");
  54. system("pause");
  55. return 0;
  56. }

4.运行截图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNDc1OTE0_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读