经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
通过层序和中序遍历序列重建二叉树
来源:cnblogs  作者:the_sky314  时间:2019/3/29 9:01:03  对本文有异议

  在学二叉树的重建时,在《算法笔记》上学到了如何通过先序(或后序)遍历序列和中序遍历序列重建二叉树,它也提出了一个问题:如何通过层序和中序遍历序列重建二叉树?我一开始按照先序和中序重建的思路思考,发现做不到。我无法确定一个点后面的点属于它的左子树还是右子树或者兄弟节点。于是我在网上查找,发现这方面的话题不多,其中还有一些不是用C++实现的。不过幸好还是找到了。于是在学习之后在这把它记录下来。

  1. 1 #include <cstdio>
  2. 2 #include <queue>
  3. 3 using namespace std;
  4. 4
  5. 5 int ceng[100];
  6. 6 int zhon[100];
  7. 7
  8. 8
  9. 9 struct node
  10. 10 {
  11. 11 int data;
  12. 12 node* left;
  13. 13 node* right;
  14. 14 };
  15. 15
  16. 16 node* create(int cengl,int cengr,int zhonl,int zhonr) //当我给你一个二叉树的中序遍历时
  17. 17 { //这个中序遍历遍历一定有一个根节点
  18. 18 if(zhonl>zhonr) //体现在层序遍历上时它一定先出现
  19. 19 { //所以顺序遍历层序遍历,一定可以先发现二叉树的根节点
  20. 20 return NULL;
  21. 21 }
  22. 22 node* root=new node;
  23. 23 int i,j;
  24. 24 int flag;
  25. 25 for(i=0;i<=(cengr-cengl);i++)
  26. 26 {
  27. 27 flag=false;
  28. 28 for(j=0;j<=(zhonr-zhonl);j++)
  29. 29 {
  30. 30 if(ceng[i+cengl]==zhon[j+zhonl])
  31. 31 {
  32. 32 flag=true;
  33. 33 break;
  34. 34 }
  35. 35 }
  36. 36 if(flag) break;
  37. 37 }
  38. 38 root->data=zhon[j+zhonl];
  39. 39 root->left=create(cengl+i+1,cengr,zhonl,zhonl+j-1);
  40. 40 root->right=create(cengl+i+1,cengr,zhonl+j+1,zhonr);
  41. 41 return root;
  42. 42 }
  43. 43
  44. 44 void cengxu(node* root)
  45. 45 {
  46. 46 queue<node*> q;
  47. 47 q.push(root);
  48. 48 while(!q.empty())
  49. 49 {
  50. 50 node* top=q.front();
  51. 51 q.pop();
  52. 52 if(top!=root) printf(" ");
  53. 53 printf("%d",top->data);
  54. 54 if(top->left) q.push(top->left);
  55. 55 if(top->right) q.push(top->right);
  56. 56 }
  57. 57 }
  58. 58
  59. 59
  60. 60 int main()
  61. 61 {
  62. 62 int n;
  63. 63 scanf("%d",&n);
  64. 64 for(int i=0;i<n;i++) scanf("%d",&ceng[i]);
  65. 65 for(int i=0;i<n;i++) scanf("%d",&zhon[i]);
  66. 66 node* root=create(0,n-1,0,n-1);
  67. 67 cengxu(root);
  68. 68 return 0;
  69. 69 }

  这个重建的方法利用了层序遍历序列中父子节点有先后顺序的特点。

原文链接:http://www.cnblogs.com/thesky/p/10614313.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号