当前位置:   article > 正文

二叉树:中序遍历非递归实现_排列数 时间限制: 1s类别: 递归->中等

排列数 时间限制: 1s类别: 递归->中等

 二叉树:中序遍历非递归实现

作者: 冯向阳时间限制: 1S章节: DS:树

截止日期: 2022-06-30 23:55:00

问题描述 :

目的:使用C++模板设计二叉树的抽象数据类型(ADT)。并在此基础上,使用二叉树ADT的基本操作,设计并实现简单应用的算法设计。

内容:(1)请参照链表的ADT模板,设计二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)

(2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。

应用4:要求设计一个非递归算法,实现二叉树的中序遍历。二叉树的存储结构的建立参见二叉树应用1。

提示:根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下:

对于任一结点P,

(1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;

(2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;

(3)直到P为NULL并且栈为空则遍历结束。

参考函数原型:

//二叉树中序遍历的非递归算法 

template<class ElemType>

void InOrder( BinaryTree<ElemType> &T );     

辅助函数:

visit函数(具体功能根据实际需要,样例仅仅输出data域的信息)

template<class ElemType>

bool visit(BinaryTreeNode<ElemType> * root){

     

    if(!root) return false; 

    else{

        cout<<root->data<<" ";     

        return true;

    }

}

输入说明 :

第一行:表示无孩子或指针为空的特殊分隔符

第二行:二叉树的先序序列(结点元素之间以空格分隔)

输出说明 :

第一行:中序遍历的结果

输入范例 :

#
A B # C D # # E # # F # G # H # #

输出范例 :

B,D,C,E,A,F,G,H


  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<stack>
  5. using namespace std;
  6. int flag1=0,flag2=0;
  7. typedef struct BiTree
  8. {
  9. string data;
  10. BiTree *lchild,*rchild;
  11. }BiTree,*BIT;
  12. void CreatBtree(BIT *T,string sym)
  13. {
  14. string ss;
  15. cin>>ss;
  16. if(ss==sym)
  17. {
  18. *T=NULL;
  19. }
  20. else
  21. {
  22. *T=new BiTree;
  23. (*T)->data=ss;
  24. CreatBtree(&(*T)->lchild,sym);
  25. CreatBtree(&(*T)->rchild,sym);
  26. }
  27. }
  28. void shuru(BIT T)
  29. {
  30. BIT p = T;
  31. stack<BiTree*>S;
  32. while (!S.empty()|| p)
  33. {
  34. if (p)
  35. {
  36. if (flag1 == 1)
  37. {
  38. cout<<',';
  39. }
  40. cout<<p->data;
  41. flag1 = 1;
  42. S.push(p);
  43. p = p->lchild;
  44. }
  45. else
  46. {
  47. p = S.top();
  48. S.pop();
  49. p = p->rchild;
  50. }
  51. }
  52. }
  53. void InOrderTraverse(BIT T)
  54. {
  55. BIT p=T;
  56. stack<BIT>S;
  57. while(p || !S.empty())
  58. {
  59. if(p)
  60. {
  61. S.push(p);
  62. p = p->lchild;
  63. }
  64. else
  65. {
  66. p=S.top();
  67. S.pop();
  68. if(flag2==1)
  69. {
  70. printf(",");
  71. }
  72. cout<<p->data;
  73. flag2=1;
  74. p = p->rchild;
  75. }
  76. }
  77. }
  78. int main()
  79. {
  80. BIT T;
  81. string sym;
  82. cin>>sym;
  83. CreatBtree(&T,sym);
  84. InOrderTraverse(T);
  85. return 0;
  86. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/232951
推荐阅读
相关标签
  

闽ICP备14008679号