当前位置:   article > 正文

线索二叉树的创建与销毁(C++数据结构)

线索二叉树的创建与销毁(C++数据结构)

【问题描述】

建立线索链表,实质上就是将二叉链表中的空指针改为指向前驱或后继的线索,而前驱或后继的信息只有在遍历该二叉树时才能得到。给定扩展二叉树的前序序列,构建二叉树。然后为这棵二叉树建立中序线索链表,并利用线索链表输出中序遍历结果。

【输入形式】

输入扩展二叉树的前序序列。

【输出形式】

利用线索二叉树输出树的中序遍历序列,并且按照中序顺序输出销毁线索二叉树的过程。

【样例输入】

abd#g###ce##f##  

【样例输出】

Inorder:dgbaecf

Inorder finished. Calling destructer...

delete d

delete g

delete b

delete a

delete e

delete c

delete f

【题目要求】

要求创建二叉树,然后建立线索链表,必须在规定的代码结构中编写,不能修改主函数。 

  1. /*定义中序线索二叉树
  2. 运行范例:
  3. abd#g###ce##f##
  4. */
  5. #include<iostream>
  6. #include<stdio.h>
  7. using namespace std;
  8. struct ThreadNode
  9. {
  10. char data;
  11. ThreadNode *lchild, *rchild;
  12. int ltag, rtag;
  13. };
  14. class ThreadBiTree
  15. {
  16. private:
  17. ThreadNode *root;//指向线索链表的头指针
  18. public:
  19. ThreadBiTree() //构造函数,建立中序线索链表
  20. {
  21. root = NULL;
  22. root = creat(root);
  23. inThread(root);
  24. }
  25. ~ThreadBiTree(); //析构函数,释放各结点的存储空间
  26. ThreadNode *next(ThreadNode *p);//查找p的后继
  27. void inOrder(); //中序遍历线索链表
  28. private:
  29. ThreadNode *creat(ThreadNode *bt);
  30. void destroy(ThreadNode *p); //线索化,由构造函数调用
  31. void inThread(ThreadNode *p); //线索化,由构造函数调用
  32. };
  33. //create函数创建二叉树
  34. ThreadNode *ThreadBiTree::creat(ThreadNode *bt)
  35. {
  36. char ch;
  37. cin>>ch;
  38. if(ch=='#'){
  39. bt=NULL;
  40. }
  41. else{
  42. bt=new ThreadNode;
  43. bt->data=ch;
  44. bt->ltag=0;
  45. bt->rtag=0;
  46. bt->lchild=creat(bt->lchild);
  47. bt->rchild=creat(bt->rchild);
  48. }
  49. return bt;
  50. }
  51. //实现二叉树线索化,这个函数由构造函数调用
  52. void ThreadBiTree::inThread(ThreadNode *p)
  53. {
  54. static ThreadNode *pre=NULL;
  55. if(p==NULL){
  56. return;
  57. }
  58. inThread(p->lchild);
  59. if(p->lchild==NULL){
  60. p->ltag=1;
  61. p->lchild=pre;
  62. }
  63. if(pre!=NULL){
  64. pre->rtag=1;
  65. pre->rchild=p;
  66. }
  67. pre=p;
  68. inThread(p->rchild);
  69. }
  70. //查找p的后继
  71. ThreadNode* ThreadBiTree::next(ThreadNode *p)
  72. {
  73. ThreadNode *q=NULL;
  74. if(p->rtag==1){
  75. q=p->rchild;
  76. }
  77. else{
  78. q=p->rchild;
  79. while(q->ltag==0){
  80. q=q->lchild;
  81. }
  82. }
  83. return q;
  84. }
  85. //中序遍历线索链表
  86. void ThreadBiTree::inOrder()
  87. {
  88. if(root==NULL){
  89. return;
  90. }
  91. ThreadNode *p;
  92. p=root;
  93. while(p->ltag==0){
  94. p=p->lchild;
  95. }
  96. cout<<p->data;
  97. while(p->rchild!=NULL){
  98. p=next(p);
  99. cout<<p->data;
  100. }
  101. }
  102. //析构函数,释放各结点的存储空间
  103. ThreadBiTree::~ThreadBiTree()
  104. {
  105. destroy(root);
  106. }
  107. //destroy函数,由析构函数调用销毁结点
  108. void ThreadBiTree::destroy(ThreadNode *p)
  109. {
  110. if(p==NULL){
  111. return;
  112. }
  113. ThreadNode *q=NULL;
  114. while(p->ltag==0){
  115. p=p->lchild;
  116. }
  117. do{
  118. q=next(p);
  119. cout<<"delete "<<p->data<<endl;
  120. delete p;
  121. p=q;
  122. }while(q->rchild!=NULL);
  123. cout<<"delete "<<p->data;
  124. delete p;
  125. }
  126. int main()
  127. {
  128. ThreadBiTree tree;
  129. cout << "Inorder:";
  130. tree.inOrder();
  131. cout <<endl<< "Inorder finished. Calling destructer..."<<endl;
  132. return 0;
  133. }

推荐哔哩哔哩懒猫老师数据结构“线索二叉树”视频。

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

闽ICP备14008679号