WHCSRL 技术网

二叉树创建新节点问题,编译通过,运行出问题解决,简易二叉树的C++实现

  1. class treenode //二叉树的节点类
  2. {
  3. public:
  4. treenode *left;
  5. treenode *right;
  6. string data;
  7. };

 这是我定义的二叉树的节点类

  1. void tree::addleft(string data)//在当前节点添加左孩子
  2. {
  3. if(cur->left==NULL)
  4. {
  5. treenode *p=cur->left;
  6. p->left=NULL;
  7. p->right=NULL;
  8. p->data=data;
  9. }
  10. else
  11. {
  12. cout<<"错误:左孩子已存在"<<endl;
  13. }
  14. }

这是我一开始写的代码,在进行左孩子添加时,直接把当前节点cur的左孩子赋给 p ,然后操作,编译可以通过,但是调试的时候就出错。

之后换了一种办法就通了,先通过new生成一个新节点,对这个节点操作,再把它赋给当前节点的左孩子

  1. void tree::addleft(string data)//在当前节点添加左孩子
  2. {
  3. if(cur->left==NULL)
  4. {
  5. treenode *p=new treenode;
  6. p->left=NULL;
  7. p->right=NULL;
  8. p->data=data;
  9. cur->left=p;
  10. }
  11. else
  12. {
  13. cout<<"错误:左孩子已存在"<<endl;
  14. }
  15. }

这是我在做数据结构时遇到的问题,初学者不断提升,后附上完整代码

  1. #include<iostream>
  2. using namespace std;
  3. class treenode
  4. {
  5. public:
  6. treenode *left;
  7. treenode *right;
  8. string data;
  9. };
  10. class tree
  11. {
  12. public:
  13. treenode *root; //根节点
  14. treenode *cur; //现在的节点
  15. tree(string data); //构造函数
  16. ~tree() {}; //析构函数
  17. // int getheight(const treenode &treeroot); //得到深度
  18. void addleft(string data); //在当前节点添加左孩子
  19. void addright(string data); //在当前节点添加右孩子
  20. void changeleft(string data); //修改当前节点左孩子的内容
  21. void changeright(string data); //修改当前节点右孩子的内容
  22. void changecur(string data); //修改当前节点的内容
  23. void deleteleft(); //在当前节点删除左孩子
  24. void deleteright(); //在当前节点删除右孩子
  25. // void deletecur(); //删除当前节点
  26. void deleteall(); //删除全部
  27. void reright(); //当前节点指向当前节点的右孩子
  28. void releft(); //当前节点指向当前节点的左孩子
  29. void reroot(); //当前节点指向根节点
  30. bool ifroot(); //判断是否为叶子节点,不是 为 1
  31. // void inverttree(); //交换左节点右节点
  32. void print(); //输出树
  33. void preorder(const treenode *treeroot); //先序遍历
  34. void inorder(const treenode *treeroot); //中序遍历
  35. };
  36. tree::tree(string data)//构造函数
  37. {
  38. root=new treenode;
  39. root->left=NULL;
  40. root->right=NULL;
  41. root->data=data;
  42. cur=root;
  43. }
  44. int getheight(const treenode *root)//得到深度
  45. {
  46. if(root==NULL)
  47. {
  48. return 0;
  49. }
  50. else
  51. {
  52. int rh,lh;
  53. lh=getheight(root->left);
  54. rh=getheight(root->right);
  55. return (lh>rh?lh:rh)+1;
  56. }
  57. }
  58. void tree::addleft(string data)//在当前节点添加左孩子
  59. {
  60. if(cur->left==NULL)
  61. {
  62. treenode *p=new treenode;;
  63. p->left=NULL;
  64. p->right=NULL;
  65. p->data=data;
  66. cur->left=p;
  67. }
  68. else
  69. {
  70. cout<<"错误:左孩子已存在"<<endl;
  71. }
  72. }
  73. void tree::addright(string data) //在当前节点添加右孩子
  74. {
  75. if(cur->right==NULL)
  76. {
  77. treenode *p=new treenode;
  78. p->left=NULL;
  79. p->right=NULL;
  80. p->data=data;
  81. cur->right=p;
  82. }
  83. else
  84. {
  85. cout<<"错误:右孩子已存在"<<endl;
  86. }
  87. }
  88. void tree::changeleft(string data) //修改当前节点左孩子的内容
  89. {
  90. if(cur->left!=NULL)
  91. {
  92. cur->data=data;
  93. }
  94. else
  95. {
  96. cout<<"错误:左孩子不存在"<<endl;
  97. }
  98. }
  99. void tree::changeright(string data) //修改当前节点右孩子的内容
  100. {
  101. if(cur->right!=NULL)
  102. {
  103. cur->data=data;
  104. }
  105. else
  106. {
  107. cout<<"错误:右孩子不存在"<<endl;
  108. }
  109. }
  110. void tree::changecur(string data) //修改当前节点的内容
  111. {
  112. cur->data=data;
  113. }
  114. void tree::deleteleft() //在当前节点删除左孩子
  115. {
  116. cur->left=NULL;
  117. }
  118. void tree::deleteright() //在当前节点删除右孩子
  119. {
  120. cur->right=NULL;
  121. }
  122. //void tree::deletecur() //删除当前节点
  123. //{
  124. //
  125. //}
  126. void tree::deleteall() //删除全部
  127. {
  128. root=NULL;
  129. }
  130. void tree::reright() //返回当前节点的右孩子
  131. {
  132. cur=cur->right;
  133. }
  134. void tree::releft() //返回当前节点的左孩子
  135. {
  136. cur=cur->left;
  137. }
  138. void tree::reroot() //返回是当前节点指向根节点
  139. {
  140. cur=root;
  141. }
  142. bool tree::ifroot() //判断是否为叶子节点,不是 为 1
  143. {
  144. if(cur->left==NULL&&cur->right==NULL)
  145. return 1;
  146. }
  147. void inverttree(treenode *root) //交换左节点右节点
  148. {
  149. if(root->left==NULL&&root->right==NULL);
  150. else
  151. {
  152. treenode *temp=root->left;
  153. root->left=root->right;
  154. root->right=temp;
  155. inverttree(root->left);
  156. inverttree(root->right);
  157. }
  158. }
  159. void tree::preorder(const treenode *treeroot) //先序遍历
  160. {
  161. if(treeroot!=NULL)
  162. {
  163. cout<<treeroot->data<<' ';
  164. preorder(treeroot->left);
  165. preorder(treeroot->right);
  166. }
  167. }
  168. void tree::inorder(const treenode *treeroot) //中序遍历
  169. {
  170. if(treeroot!=NULL)
  171. {
  172. inorder(treeroot->left);
  173. cout<<treeroot->data<<' ';
  174. inorder(treeroot->right);
  175. }
  176. }
  177. void tree::print() //输出树
  178. {
  179. cout<<"先序:";
  180. preorder(root);
  181. cout<<endl<<"中序:";
  182. inorder(root);
  183. }
  184. int main()
  185. {
  186. tree a("a");
  187. a.addleft("b");
  188. a.addright("c");
  189. a.releft();
  190. a.addleft("d");
  191. a.addright("e");
  192. a.reroot();
  193. a.reright();
  194. a.addleft("f");
  195. a.addright("g");
  196. cout<<"交换前:"<<endl;
  197. a.print();
  198. inverttree(a.root);
  199. cout<<endl<<"交换后:"<<endl;
  200. a.print();
  201. return 0;
  202. }

问题解决了,但二叉树还有许多功能没有实现,以及很多需要改进。

如果哪里有问题,欢迎指出,一起改进

推荐阅读