当前位置:   article > 正文

数据结构——线索树

数据结构——线索树

核心思路就是要先将空指针转为线索 也就是多出来的n+1个指针,然后再将这些指针连成一个链表,遍历就可以达到O(n)的速度打出

以下代码为中序遍历 前序和后续随缘更新

  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. typedef struct Node
  5. {
  6. char data;
  7. struct Node *l, *r;
  8. int Ltag, Rtag;
  9. } *TR, TN;
  10. TR createNode(char data)
  11. {
  12. TR pnew = (TR)malloc(sizeof(TN));
  13. pnew->data = data;
  14. pnew->l = pnew->r = NULL;
  15. pnew->Ltag = pnew->Rtag = 0;
  16. return pnew;
  17. }
  18. TR pre = NULL;
  19. void createTr(TR *root)
  20. {
  21. char ch;
  22. cin >> ch;
  23. if (ch == '#')
  24. {
  25. *root = NULL;
  26. }
  27. else
  28. {
  29. *root = createNode(ch);
  30. createTr(&(*root)->l);
  31. createTr(&(*root)->r);
  32. }
  33. }
  34. void Pre(TR root)
  35. {
  36. cout << root->data << " ";
  37. if (root->l != NULL)
  38. Pre(root->l);
  39. if (root->r != NULL)
  40. Pre(root->r);
  41. }
  42. void Thread_mid(TR *root)
  43. {
  44. if (*root == NULL)
  45. return;
  46. Thread_mid(&(*root)->l);
  47. if ((*root)->l == NULL)
  48. {
  49. (*root)->Ltag = 1;
  50. (*root)->l = pre;
  51. }
  52. if (pre != NULL && pre->r == NULL)
  53. {
  54. pre->Rtag = 1;
  55. pre->r = *root;
  56. }
  57. pre = *root;
  58. Thread_mid(&(*root)->r);
  59. }
  60. TR findnext(TR root)
  61. {
  62. if (root->Rtag == 1)
  63. return root->r;
  64. else
  65. {
  66. root = root->r;
  67. while (root->Ltag == 0)
  68. root = root->l;
  69. return root;
  70. }
  71. }
  72. void midorder(TR root)
  73. {
  74. TR p = root;
  75. while (p->l != NULL)
  76. p = p->l;
  77. cout << p->data << " ";
  78. while (p->r != NULL)
  79. {
  80. p = findnext(p);
  81. cout << p->data << " ";
  82. }
  83. }
  84. int main()
  85. {
  86. TR root;
  87. createTr(&root);
  88. // Pre(root);
  89. Thread_mid(&root);
  90. midorder(root);
  91. }

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

闽ICP备14008679号