二叉树遍历序列还原

迷南。 2022-06-02 07:23 284阅读 0赞





















成绩 10 开启时间 2017年11月6日 星期一 12:20
折扣 0.8 折扣时间 2017年11月28日 星期二 18:20
允许迟交 关闭时间 2018年01月8日 星期一 18:20

给出二叉树的中序遍历序列和后序遍历序列,编程还原该二叉树。

输入:
  第1行为二叉树的中序遍历序列
  第2行为二叉树的后序遍历序列

输出:
  二叉树的按层遍历序列














































  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示


  1. badcfeg↵

  2. bdfgeca↵


以文本方式显示


  1. abcdefg↵


1秒 64M 0
测试用例 2 以文本方式显示


  1. cbdafeg↵

  2. cbdfgea↵


以文本方式显示


  1. adebfgc↵


1秒 64M 0
测试用例 3 以文本方式显示


  1. edcba↵

  2. edcba↵


以文本方式显示


  1. abcde↵


1秒 64M 0
测试用例 6 以文本方式显示


  1. bdfgeca↵

  2. gfedcba↵


以文本方式显示


  1. abcdefg↵


1秒 64M 0

此题有一定的借鉴成分。

这题多写了几个与本体无关的函数。BuildTree这个函数是有用的俄,而PostMidCreateTree这个函数是从网上看到的,但没成功。

InOrderTravers这个函数是因为当时没看懂题就写了个中序遍历,其实应该是Leveltravers这个函数

  1. #include <string>
  2. #include <iostream>
  3. #include<queue>
  4. using namespace std;
  5. //二叉链表表示二叉树
  6. typedef struct BiNode
  7. {
  8. char data;//节点数据
  9. struct BiNode * lchild;//左孩子
  10. struct BiNode * rchild;//右孩子
  11. }BiNode, *BiTree;
  12. void BuildTree(BiTree &t,string Inorder,string Postorder)
  13. {
  14. if (Inorder.length()==0)
  15. {
  16. //t = NULL;
  17. return;
  18. }
  19. int length_Post = Postorder.length();
  20. char Rootnode = Postorder[length_Post- 1];
  21. int index = Inorder.find(Rootnode);
  22. string lchild_inorder = Inorder.substr(0, index);//左孩子的中序序列
  23. string rchild_inorder = Inorder.substr(index + 1);//右孩子的中序序列
  24. int lchild_length = lchild_inorder.length();//左孩子长度
  25. int rchild_length = rchild_inorder.length();//右孩子长度
  26. string rchild_postorder = Postorder.substr(lchild_length, length_Post - 1 - lchild_length);//右孩子的后序序列
  27. string lchild_postorder = Postorder.substr(0,lchild_length);//左孩子的后序序列
  28. t = (BiTree)malloc(sizeof(BiNode));
  29. if (t)
  30. {
  31. t->data = Rootnode; t->lchild = t->rchild = NULL;
  32. BuildTree(t->lchild,lchild_inorder,lchild_postorder);//创建左孩子
  33. BuildTree(t->rchild, rchild_inorder, rchild_postorder);//创建右孩子
  34. }
  35. }
  36. char post[50];
  37. char mid[50];
  38. int Position(char c)
  39. {
  40. return strchr(mid, c) - mid;
  41. }
  42. void PostMidCreateTree(BiTree &pn, int i, int j, int len)
  43. {
  44. if (len <= 0)
  45. return;
  46. pn = new BiNode; pn->lchild = pn->rchild = NULL;
  47. pn->data = post[i];
  48. int m = Position(post[i]);
  49. PostMidCreateTree(pn->lchild, i - 1 - (len - 1 - (m - j)), j, m - j);//注意参数:m-j左子树的长度,len-1-(m-j)右子树的长度
  50. PostMidCreateTree(pn->rchild, i - 1, m + 1, len - 1 - (m - j));
  51. }
  52. void InOrderTraverse(BiTree & t)
  53. {
  54. if (t != NULL)
  55. {
  56. InOrderTraverse(t->lchild);
  57. cout << t->data;
  58. InOrderTraverse(t->rchild);
  59. }
  60. }
  61. void leveltravers(BiTree t)
  62. {
  63. queue<BiTree> Q;
  64. BiTree cur = t;
  65. Q.push(cur);
  66. while (!Q.empty())
  67. {
  68. cur = Q.front();
  69. Q.pop();
  70. printf("%c", cur->data);
  71. if (cur->lchild)
  72. {
  73. Q.push(cur->lchild);
  74. }
  75. if (cur->rchild)
  76. Q.push(cur->rchild);
  77. }
  78. }
  79. int main()
  80. {
  81. BiTree t;
  82. string Inorder;
  83. string Postorder;
  84. getline(cin, Inorder);
  85. getline(cin, Postorder);
  86. BuildTree(t, Inorder, Postorder);
  87. leveltravers(t);
  88. printf("\n");
  89. return 0;
  90. }

发表评论

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

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

相关阅读

    相关 数据结构基础 各种还原

    面试题目或多或少会出现这样的选择题或者简答题,根据前序、中序、后序遍历还原二叉树。 前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,