.把二元查找树转变成排序的双向链表

举报
香菜聊游戏 发表于 2021/07/15 01:09:17 2021/07/15
【摘要】 参考地址为 //* Copyright(C) 2011 //*//* FUNCTION : TreeToLink//* DESCRIPTION : Tree to link//* PARAMETERS : Type Name Description//* RETURN : Type Values Description//* CREATED DATE/BY : 2...

参考地址为



  
  1. //* Copyright(C) 2011
  2. //*
  3. //* FUNCTION : TreeToLink
  4. //* DESCRIPTION : Tree to link
  5. //* PARAMETERS : Type Name Description
  6. //* RETURN : Type Values Description
  7. //* CREATED DATE/BY : 2011/11/30 perfect2011
  8. //*
  9. //* REVISION HISTORY:V1.0
  10. /*
  11. 1.把二元查找树转变成排序的双向链表
  12. 题目:
  13. 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
  14. 要求不能创建任何新的结点,只调整指针的指向。
  15. 10
  16. / /
  17. 6 14
  18. / / / /
  19. 4 8 12 16
  20. 转换成双向链表
  21. 4=6=8=10=12=14=16。
  22. */
  23. #include "stdafx.h"
  24. #include <iostream>
  25. using namespace std;
  26. struct TreeNode
  27. {
  28. int m_nValue; // value of node
  29. TreeNode *m_pLeft; // left child of node
  30. TreeNode *m_pRight; // right child of node
  31. };
  32. typedef TreeNode DoubleList;
  33. DoubleList * pHead;
  34. DoubleList * pListIndex;
  35. //生成查找树
  36. void adjust(TreeNode * & pCurrent, int value)
  37. {
  38. //根节点的处理,生成根节点,为pCurrent赋值 重点理解:注意为传址,修改了main内的pRoot
  39. if(NULL == pCurrent)
  40. {
  41. TreeNode *pEnd = new TreeNode();
  42. pEnd ->m_pLeft =NULL;
  43. pEnd ->m_pRight = NULL;
  44. pEnd ->m_nValue = value;
  45. pCurrent = pEnd;
  46. }
  47. //
  48. else
  49. { //在左子树添加
  50. if (value<pCurrent->m_nValue)
  51. {
  52. adjust(pCurrent->m_pLeft,value);
  53. }
  54. //在右子树添加
  55. else if(value>pCurrent->m_nValue)
  56. {
  57. adjust(pCurrent->m_pRight,value);
  58. }
  59. else
  60. {
  61. cout<<" 重 复 的 节 点 "<<endl;
  62. }
  63. }
  64. }
  65. void addList(TreeNode *pCurrent);
  66. //covert the tree to link
  67. void covertTreeToLink(TreeNode *pCurrent)
  68. {
  69. //中序读出
  70. if(pCurrent==NULL)
  71. {
  72. return;
  73. }
  74. //遍历左子树
  75. if(NULL != pCurrent->m_pLeft)
  76. {
  77. covertTreeToLink(pCurrent->m_pLeft);
  78. }
  79. //将根节点加进链表
  80. addList(pCurrent);
  81. //遍历右子树
  82. if(NULL != pCurrent->m_pRight)
  83. {
  84. covertTreeToLink(pCurrent->m_pRight);
  85. }
  86. }
  87. //添加节点到链表
  88. void addList(TreeNode *pCurrent)
  89. {
  90. if(NULL ==pListIndex)
  91. pHead = pListIndex;
  92. else
  93. {
  94. pCurrent->m_pLeft = pListIndex;
  95. pListIndex ->m_pRight = pCurrent;
  96. pListIndex = pCurrent;//指针后移
  97. }
  98. cout<<"Now "<<pCurrent->m_nValue<<endl;
  99. }
  100. int main()
  101. { TreeNode * pRoot = NULL;
  102. pListIndex = NULL;//链表的移动指针
  103. pHead = NULL;//链表的头指针
  104. adjust(pRoot, 10);
  105. adjust(pRoot, 4);
  106. adjust(pRoot, 6);
  107. adjust(pRoot, 8);
  108. adjust(pRoot, 12);
  109. adjust(pRoot, 14);
  110. adjust(pRoot, 15);
  111. adjust(pRoot, 16);
  112. covertTreeToLink(pRoot);
  113. getchar();
  114. return 0;
  115. }


文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/7026968

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。