C++实现二叉树

 
  1. //二叉树.cpp
  2. #include "stdafx.h"
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include <ctime>
  6. #include<list>
  7. using namespace std;
  1. struct node
  2. {
  3. int data;
  4. node * father;
  5. node * lchild;
  6. node * rchild;
  7. };
  8.  
  9.  
  10. class tree
  11. {
  12. private:
  13. node * root;//根节点
  14. public:
  15. tree();
  16. ~tree();
  17. void insert(int data);
  18. node * findNode(int data);
  19. void preOrder(node *p);//前
  20. void inOrder(node *p);//中
  21. void lastOrder(node *p);//后
  22. void clear(node *p);//清空树,即删除整棵树
  23. node* getRoot();
  24. void levelOrder();//层次遍历
  25. void deleteByData(int data);//删除节点(较复杂)
  26. };
  27.  
  28.  
  29. tree::tree()
  30. {
  31. root = nullptr;
  32. }
  33. tree::~tree()
  34. {
  35. clear(root); 
  36. root = nullptr;
  37. }
  38. void tree::insert(int data)
  39. {
  40. if (root == nullptr)//是否是空树
  41. {
  42. root = new node;
  43. root->data = data;
  44. root->lchild = root->rchild = nullptr;
  45. }
  46. else
  47. {
  48. node *p, *q;
  49. p = root;
  50. while (true)
  51. {
  52. if (p->data <= data)
  53. {
  54. if (p->rchild == nullptr)
  55. {
  56. p->rchild = new node;
  57. p->rchild->lchild = p->rchild->rchild = nullptr;
  58. p->rchild->data = data;
  59. break;
  60. }
  61. p = p->rchild;
  62. }
  63. else
  64. {
  65. if (p->lchild == nullptr)
  66. {
  67. p->lchild = new node;
  68. p->lchild->lchild = p->lchild->rchild = nullptr;
  69. p->lchild->data = data;
  70. break;
  71. }
  72. p = p->lchild;
  73. }
  74. }
  75. }
  76. }
  77. node * tree::findNode(int data)
  78. {
  79. node *p = root;
  80. while (p != nullptr)
  81. {
  82. if (p->data == data)
  83. break;
  84. else if (p->data < data)
  85. p = p->rchild;
  86. else p = p->lchild;
  87. }
  88. return p;
  89. }
  90. void tree::preOrder(node *p)//前
  91. {
  92. if (p != nullptr)
  93. {
  94. cout << p->data << '\t';
  95. preOrder(p->lchild);
  96. preOrder(p->rchild);
  97. }
  98. }
  99. void tree::inOrder(node *p)//中
  100. {
  101. if (p != nullptr)
  102. {
  103. inOrder(p->lchild);
  104. cout << p->data << '\t';
  105.  
  106.  
  107. inOrder(p->rchild);
  108. }
  109. }
  110. void tree::lastOrder(node *p)//后
  111. {
  112. if (p != nullptr)
  113. {
  114. lastOrder(p->lchild);
  115. lastOrder(p->rchild); cout << p->data << '\t';
  116. }
  117. }
  118. void tree::clear(node *p)
  119. {
  120. if (p != nullptr)
  121. {
  122. clear(p->lchild);
  123. clear(p->rchild);
  124. p = nullptr;
  125. }
  126. }
  127. node* tree::getRoot()
  128. {
  129. return root;
  130. }
  131. void tree::levelOrder()
  132. {
  133. list<node*>lis;
  134. lis.push_back(root);
  135. node *p;
  136. while (lis.empty() == 0)
  137. {
  138. p = lis.front();
  139. if (p != nullptr)
  140. {
  141. lis.push_back(p->lchild);
  142. lis.push_back(p->rchild);
  143. }
  144. cout << p->data << '\t';
  145. }
  146. lis.pop_front();//出队
  147. }
  148. void tree::deleteByData(int data)
  149. {
  150. node *p = findNode(data);//查找
  151. if (p == nullptr)return;
  152. else if (p == root)
  153. {
  154. if (root->lchild == nullptr&&root->rchild == nullptr)
  155. {
  156. delete root;
  157. root = nullptr;
  158. }
  159. }
  160. else if (root->lchild == nullptr)//左边为空右边不为空
  161. {
  162. root = root->rchild;
  163. delete p;
  164. }
  165. else if (root->rchild == nullptr)//右边为空左边不为空
  166. {
  167. root = root->lchild;
  168. delete p;
  169. }
  170. else
  171. {
  172. node* q = root->lchild;
  173. while (q->rchild != nullptr)
  174. {
  175. q = q->rchild;
  176. }//q指向最大的节点
  177. //将这个节点拿下来 root代替
  178. q->father->rchild = nullptr;
  179. q->father = root->father;
  180. q->lchild = root->lchild;
  181. q->rchild = root->rchild;
  182. root = q;
  183. delete root;
  184. }
  185.  
  186.  
  187.  
  188.  
  189. }
  190.  
  191.  
  192.  
  193.  
  194. int _tmain(int argc, _TCHAR* argv[])
  195. {
  196. tree mytree;
  197. srand((unsigned)time(NULL));
  198. for (int i = 0; i < 10; i++)
  199. {
  200. mytree.insert(rand() % 100);
  201. }
  202.  
  203.  
  204. cout << "前序遍历:"<<endl ;
  205. mytree.preOrder(mytree.getRoot());
  206. cout << endl;
  207.  
  208.  
  209. cout << "中序遍历:" << endl;
  210. mytree.inOrder(mytree.getRoot());
  211. cout << endl;
  212.  
  213.  
  214. cout << "后序遍历:" << endl;
  215. mytree.lastOrder(mytree.getRoot());
  216. cout << endl;
  217.  
  218.  
  219. mytree.levelOrder();
  220. cout << endl;
  221.  
  222.  
  223. system("pause");
  224. return 0;
  225. }
  226.  
  227.  
  1.  
  2.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淮城一只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值