用前序中序建立二叉树并以层序遍历和后序遍历输出

writer:pprp

实现过程主要是通过递归,进行分解得到结果
代码如下:
  1. #include <iostream>
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 1000;
  7. struct tree
  8. {
  9. tree* l;
  10. tree* r;
  11. int data;
  12. tree()
  13. {
  14. l = NULL;
  15. r = NULL;
  16. data = 0;
  17. }
  18. };
  19. void LevelOrder(tree * root)
  20. {
  21. queue<tree*> q;
  22. tree * p = root;
  23. q.push(p);
  24. while(!q.empty())
  25. {
  26. p = q.front();
  27. q.pop();
  28. cout << p->data << " ";
  29. if(p->l != NULL)
  30. q.push(p->l);
  31. if(p->r != NULL)
  32. q.push(p->r);
  33. }
  34. }
  35. void PostOrder(tree * root)
  36. {
  37. if(root != NULL)
  38. {
  39. PostOrder(root->l);
  40. PostOrder(root->r);
  41. cout << root->data << " ";
  42. }
  43. }
  44. tree * CreateTree(int* pre, int* in, int n)
  45. {
  46. tree * node = NULL;
  47. int lpre[N], rpre[N];
  48. int lin[N],rin[N];
  49. memset(lin,0,sizeof(lin)),memset(rin,0,sizeof(rin)),
  50. memset(lpre,0,sizeof(lpre)),memset(rpre,0,sizeof(rpre));
  51. if(n == 0)
  52. return NULL;
  53. node = new tree;
  54. node->data = pre[1];
  55. int lincnt = 1, rincnt = 1;
  56. int lprecnt = 1, rprecnt = 1;
  57. // deal with in order
  58. for(int i = 1; i <= n ; i++)
  59. {
  60. if(in[i]!=pre[1])
  61. {
  62. if(i <= lincnt)
  63. lin[lincnt++] = in[i];
  64. else
  65. rin[rincnt++] = in[i];
  66. }
  67. }
  68. lincnt--,rincnt--;
  69. // deal with pre order
  70. for(int i = 2; i <= n ; i++)
  71. {
  72. if(i < (lincnt+2))
  73. lpre[lprecnt++] = pre[i];
  74. else
  75. rpre[rprecnt++] = pre[i];
  76. }
  77. lprecnt--,rprecnt--;
  78. node->l = CreateTree(lpre,lin,lincnt);
  79. node->r = CreateTree(rpre,rin,rincnt);
  80. return node;
  81. }
  82. int main()
  83. {
  84. int n;
  85. cin >> n;
  86. int *pre, *in;
  87. pre = new int[n+1];
  88. in = new int[n+1];
  89. for(int i = 1; i <= n ; i++)
  90. cin >> pre[i];
  91. for(int i = 1; i <= n ; i++)
  92. cin >> in[i];
  93. tree * root = CreateTree(pre,in,n);
  94. LevelOrder(root);
  95. cout << endl;
  96. PostOrder(root);
  97. return 0;
  98. }

数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出的更多相关文章

  1. 数据结构实习 problem L 由二叉树的中序层序重建二叉树

    由二叉树的中序层序重建二叉树 writer:pprp 用层序中序来重建二叉树 代码点这里 其实本质上与前序中序建立二叉树没有什么太大区别 大概思路: 递归解法,对当前层进行处理,通过层序遍历可以得到当 ...

  2. python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)

    python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...

  3. 二叉树:前序遍历、中序遍历、后序遍历,BFS,DFS

    1.定义 一棵二叉树由根结点.左子树和右子树三部分组成,若规定 D.L.R 分别代表遍历根结点.遍历左子树.遍历右子树,则二叉树的遍历方式有 6 种:DLR.DRL.LDR.LRD.RDL.RLD.由 ...

  4. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  5. 数据结构实习 Problem H 迷宫的最短路径

    数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...

  6. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  7. UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)

    题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...

  8. 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

    好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...

  9. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

随机推荐

  1. Webpack4.x 入门

    概览 新建项目 npm init -y 安装webpack & webpack-cli (c)npm install -D webpack (c)npm install -D webpack- ...

  2. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

  3. 3.Github介绍

    很多人都知道,Linus在1991年创建了开源的Linux.从此,Linux系统不断发展,已经成为最大的服务器系统软件了.Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的 ...

  4. 前端 Dom 直接选择器

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  5. JavaWeb—Base64编码(转载)

    基本概念 Base64这个术语最初是在“MIME内容传输编码规范”中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种“二进制到文本”的编码方法,它能够将给定 ...

  6. Spark2.0 特征提取、转换、选择之二:特征选择、文本处理,以中文自然语言处理(情感分类)为例

    特征选择 RFormula RFormula是一个很方便,也很强大的Feature选择(自由组合的)工具. 输入string 进行独热编码(见下面例子country) 输入数值型转换为double(见 ...

  7. ambari rest api (修改集群配置文件)

    1.找到你需要修改的配置的最新版本 curl -u admin:admin -H "X-Requested-By: ambari" -X GET http://AMBARI_SER ...

  8. 转Hibernate Annotation mappedBy注解理解

    在Annotation 中有这么一个@mappedBy 属性注解,相信有些同学还是对这个属性有些迷惑,上网找了些理解@mappedBy比较深刻的资料,下面贴出来供大家参考. http://xiaoru ...

  9. Mozilla Network Security Services拒绝服务漏洞

    解决办法: 运行 yum update nss yum update nss

  10. 细说PHP7

    PHP7带来的新东西 1.类型的声明. 可以使用字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool),来声明函数的参数类型与函数返回值. declare(s ...