c++实现二叉树,包括先序中序遍历,添加删除节点以及析构

  • BinaryTree.h
#include<iostream>
using namespace std;
class TreeNode
{
public:
	TreeNode* left;
	TreeNode* right;
	int val;
	TreeNode(int val);
	TreeNode(int val, TreeNode* left, TreeNode* right);
	void preOrder();
	void infixOrder();
	void myDestruct();
	TreeNode* preFind(int num);
	bool addNode(int val);
	void deleteNode(int val);
};
class BinaryTree
{
private:
	int size;
public:
	TreeNode* root;
	BinaryTree(TreeNode* root);
	~BinaryTree();
	void preOrder();//前序遍历
	void infixOrder();//中序遍历
	TreeNode* preFind(int num);//前序查找
	bool addNode(int val);//插入
	int getSize();
	void deleteNode(int val);
};
  • BinaryTree.cpp
#include "BinaryTree.h"
TreeNode::TreeNode(int val)
{
	this->val = val;
	this->left = nullptr;
	this->right = nullptr;
}
TreeNode::TreeNode(int val, TreeNode* left, TreeNode* right)
{
	this->val = val;
	this->left = left;
	this->right = right;
}
void TreeNode::preOrder()
{
	cout << this->val << endl;
	if (this->left!=nullptr)
	{
		this->left->preOrder();
	}
	if (this->right!=nullptr)
	{
		this->right->preOrder();
	}	
}
void TreeNode::infixOrder()
{
	if (this->left != nullptr)
	{
		this->left->infixOrder();
	}
	cout << this->val << endl;
	if (this->right != nullptr)
	{
		this->right->infixOrder();
	}
}
TreeNode* TreeNode::preFind(int num)
{
	if (this->val == num)
	{
		cout << "查找成功" << endl;
		return this;
	}
	if (this->left!=nullptr)
	{
		this->left->preFind(num);
	}
	if (this->right != nullptr)
	{
		this->right->preFind(num);
	}
}
bool TreeNode::addNode(int val)
{
	if (this->val == val)
	{
		cout << "二叉树中已有该值" << endl;
		return false;
	}
	if (this->val < val)
	{
		if (this->right == nullptr)
		{
			this->right = new TreeNode(val);
			return true;
		}
		else
		{
			this->right->addNode(val);
		}
	}
	if (this->val > val)
	{
		if (this->left == nullptr)
		{
			this->left = new TreeNode(val);
			return true;
		}
		else
		{
			this->left->addNode(val);
		}
	}
}
void TreeNode::myDestruct()
{
	if (this->left != nullptr)
	{
		this->left->myDestruct();
	}
	if (this->right != nullptr)
	{
		this->right->myDestruct();
	}
	delete this;
}

void TreeNode::deleteNode(int val)
{
	if (this->left != nullptr && this->left->val == val)
	{
		this->left->myDestruct();
		this->left = nullptr;
		cout << "删除成功" << endl;
		return;
	}
	if (this->right != nullptr && this->right->val == val)
	{
		this->right->myDestruct();
		this->right = nullptr;
		cout << "删除成功" << endl;
		return;
	}
	if (this->left != nullptr)
	{
		this->left->deleteNode(val);
	}
	if (this->right != nullptr)
	{
		this->right->deleteNode(val);
	}
}




BinaryTree::BinaryTree(TreeNode* root)
{
	this->root = root;
	size = 1;
}
void BinaryTree::preOrder()
{
	if (root!=nullptr)
	{
		cout << "先序遍历开始" << endl;
		root->preOrder();
		cout << "先序遍历开始" << endl;
	}
	else
	{
		cout << "二叉树为空" << endl;
	}
}
void BinaryTree::infixOrder()
{
	if (root!=nullptr)
	{
		cout << "中序遍历开始" << endl;
		root->infixOrder();
		cout << "中序遍历结束" << endl;
	}
	else
	{
		cout << "二叉树为空" << endl;
	}
}
BinaryTree::~BinaryTree()
{
	if (root!=nullptr)
	{
		root->myDestruct();
	}
	cout << "析构完成" << endl;
}
TreeNode* BinaryTree::preFind(int num)
{
	if (root != nullptr)
	{
		return root->preFind(num);
	}
	else
	{
		cout << "当前树是个空树" << endl;
		return NULL;
	}
}
bool BinaryTree::addNode(int val)
{
	if (root == nullptr)
	{
		this->root = new TreeNode(val);
		return true;
	}
	else
	{
		root->addNode(val);
		size++;
	}
}
int BinaryTree::getSize()
{
	return size;
}
void BinaryTree::deleteNode(int val)
{
	if (root == nullptr)
	{
		cout << "树为空" << endl;
	}
	else if (root->val == val)
	{
		cout << "删除根节点成功" << endl;
		root->myDestruct();
		root = NULL;
		delete this;
	}
	else
	{
		this->root->deleteNode(val);
	}
}
  • 注意,析构函数中,一定要使用后序遍历的方式释放各个节点,一定要最后delete this,因为this指针是常指针,不可以改变指向,所以delete后,对于this的任何操作都一定是错误的,只有采取后序遍历的方式才可以正确释放掉全部的节点的内存空间
  • 测试代码
#include "BinaryTree.h"
int main()
{
	TreeNode* root = new TreeNode(5);
	BinaryTree bt(root);
	bt.addNode(2);
	bt.addNode(3);
	bt.addNode(4);
	bt.addNode(6);
	bt.addNode(1);
	bt.addNode(8);
	bt.addNode(10);
	bt.preOrder();
	bt.infixOrder();
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值