二叉树创建新节点问题,编译通过,运行出问题解决,简易二叉树的C++实现
- class treenode //二叉树的节点类
- {
- public:
- treenode *left;
- treenode *right;
- string data;
- };
这是我定义的二叉树的节点类
- void tree::addleft(string data)//在当前节点添加左孩子
- {
- if(cur->left==NULL)
- {
- treenode *p=cur->left;
- p->left=NULL;
- p->right=NULL;
- p->data=data;
- }
- else
- {
- cout<<"错误:左孩子已存在"<<endl;
- }
- }
这是我一开始写的代码,在进行左孩子添加时,直接把当前节点cur的左孩子赋给 p ,然后操作,编译可以通过,但是调试的时候就出错。
之后换了一种办法就通了,先通过new生成一个新节点,对这个节点操作,再把它赋给当前节点的左孩子
- void tree::addleft(string data)//在当前节点添加左孩子
- {
- if(cur->left==NULL)
- {
- treenode *p=new treenode;
- p->left=NULL;
- p->right=NULL;
- p->data=data;
- cur->left=p;
- }
- else
- {
- cout<<"错误:左孩子已存在"<<endl;
- }
- }
这是我在做数据结构时遇到的问题,初学者不断提升,后附上完整代码
- #include<iostream>
- using namespace std;
- class treenode
- {
- public:
- treenode *left;
- treenode *right;
- string data;
- };
- class tree
- {
- public:
- treenode *root; //根节点
- treenode *cur; //现在的节点
-
- tree(string data); //构造函数
- ~tree() {}; //析构函数
- // int getheight(const treenode &treeroot); //得到深度
- void addleft(string data); //在当前节点添加左孩子
- void addright(string data); //在当前节点添加右孩子
- void changeleft(string data); //修改当前节点左孩子的内容
- void changeright(string data); //修改当前节点右孩子的内容
- void changecur(string data); //修改当前节点的内容
- void deleteleft(); //在当前节点删除左孩子
- void deleteright(); //在当前节点删除右孩子
- // void deletecur(); //删除当前节点
- void deleteall(); //删除全部
- void reright(); //当前节点指向当前节点的右孩子
- void releft(); //当前节点指向当前节点的左孩子
- void reroot(); //当前节点指向根节点
- bool ifroot(); //判断是否为叶子节点,不是 为 1
- // void inverttree(); //交换左节点右节点
- void print(); //输出树
- void preorder(const treenode *treeroot); //先序遍历
- void inorder(const treenode *treeroot); //中序遍历
-
- };
- tree::tree(string data)//构造函数
- {
- root=new treenode;
- root->left=NULL;
- root->right=NULL;
- root->data=data;
- cur=root;
- }
- int getheight(const treenode *root)//得到深度
- {
- if(root==NULL)
- {
- return 0;
- }
- else
- {
- int rh,lh;
- lh=getheight(root->left);
- rh=getheight(root->right);
- return (lh>rh?lh:rh)+1;
- }
-
- }
- void tree::addleft(string data)//在当前节点添加左孩子
- {
- if(cur->left==NULL)
- {
- treenode *p=new treenode;;
- p->left=NULL;
- p->right=NULL;
- p->data=data;
- cur->left=p;
- }
- else
- {
- cout<<"错误:左孩子已存在"<<endl;
- }
- }
- void tree::addright(string data) //在当前节点添加右孩子
- {
- if(cur->right==NULL)
- {
- treenode *p=new treenode;
- p->left=NULL;
- p->right=NULL;
- p->data=data;
- cur->right=p;
- }
- else
- {
- cout<<"错误:右孩子已存在"<<endl;
- }
- }
- void tree::changeleft(string data) //修改当前节点左孩子的内容
- {
- if(cur->left!=NULL)
- {
-
- cur->data=data;
- }
- else
- {
- cout<<"错误:左孩子不存在"<<endl;
- }
- }
- void tree::changeright(string data) //修改当前节点右孩子的内容
- {
- if(cur->right!=NULL)
- {
-
- cur->data=data;
- }
- else
- {
- cout<<"错误:右孩子不存在"<<endl;
- }
- }
- void tree::changecur(string data) //修改当前节点的内容
- {
- cur->data=data;
- }
- void tree::deleteleft() //在当前节点删除左孩子
- {
- cur->left=NULL;
- }
- void tree::deleteright() //在当前节点删除右孩子
- {
- cur->right=NULL;
- }
- //void tree::deletecur() //删除当前节点
- //{
- //
- //}
- void tree::deleteall() //删除全部
- {
- root=NULL;
- }
- void tree::reright() //返回当前节点的右孩子
- {
- cur=cur->right;
- }
- void tree::releft() //返回当前节点的左孩子
- {
- cur=cur->left;
- }
- void tree::reroot() //返回是当前节点指向根节点
- {
- cur=root;
- }
- bool tree::ifroot() //判断是否为叶子节点,不是 为 1
- {
- if(cur->left==NULL&&cur->right==NULL)
- return 1;
- }
- void inverttree(treenode *root) //交换左节点右节点
- {
- if(root->left==NULL&&root->right==NULL);
- else
- {
- treenode *temp=root->left;
- root->left=root->right;
- root->right=temp;
- inverttree(root->left);
- inverttree(root->right);
- }
- }
- void tree::preorder(const treenode *treeroot) //先序遍历
- {
- if(treeroot!=NULL)
- {
- cout<<treeroot->data<<' ';
- preorder(treeroot->left);
- preorder(treeroot->right);
- }
- }
- void tree::inorder(const treenode *treeroot) //中序遍历
- {
- if(treeroot!=NULL)
- {
- inorder(treeroot->left);
- cout<<treeroot->data<<' ';
- inorder(treeroot->right);
- }
- }
- void tree::print() //输出树
- {
- cout<<"先序:";
- preorder(root);
- cout<<endl<<"中序:";
- inorder(root);
- }
- int main()
- {
- tree a("a");
- a.addleft("b");
- a.addright("c");
- a.releft();
- a.addleft("d");
- a.addright("e");
- a.reroot();
- a.reright();
- a.addleft("f");
- a.addright("g");
- cout<<"交换前:"<<endl;
- a.print();
- inverttree(a.root);
- cout<<endl<<"交换后:"<<endl;
- a.print();
- return 0;
- }
问题解决了,但二叉树还有许多功能没有实现,以及很多需要改进。
如果哪里有问题,欢迎指出,一起改进
推荐阅读