栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树创建新节点问题,编译通过,运行出问题解决,简易二叉树的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<<"错误:左孩子已存在"< 

这是我一开始写的代码,在进行左孩子添加时,直接把当前节点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< 

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号