#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);
};
#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;
}