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<<"错误:左孩子已存在"<
这是我一开始写的代码,在进行左孩子添加时,直接把当前节点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<<"错误:左孩子已存在"<
这是我在做数据结构时遇到的问题,初学者不断提升,后附上完整代码
#include
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<<"错误:左孩子已存在"<right==NULL)
{
treenode *p=new treenode;
p->left=NULL;
p->right=NULL;
p->data=data;
cur->right=p;
}
else
{
cout<<"错误:右孩子已存在"<left!=NULL)
{
cur->data=data;
}
else
{
cout<<"错误:左孩子不存在"<right!=NULL)
{
cur->data=data;
}
else
{
cout<<"错误:右孩子不存在"<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<data<<' ';
preorder(treeroot->left);
preorder(treeroot->right);
}
}
void tree::inorder(const treenode *treeroot) //中序遍历
{
if(treeroot!=NULL)
{
inorder(treeroot->left);
cout<data<<' ';
inorder(treeroot->right);
}
}
void tree::print() //输出树
{
cout<<"先序:";
preorder(root);
cout<
问题解决了,但二叉树还有许多功能没有实现,以及很多需要改进。
如果哪里有问题,欢迎指出,一起改进



