二叉树的查找、创建、遍历、修改、删除操作
#include<iostream>
#include<queue>//用于层序遍历
using namespace std;
//节点类
class node {
public:
node* left;
node* right;
int data;
};
class create2tree {
public:
node* root;
create2tree() {
node* root = new node();
root->left = NULL;
root->right =NULL;
}
~create2tree() {
delete root;
}
void create2Tree(node* &temp);
void showfirsttree(node* temp);
void showmidtree(node* temp);
void showfinaltree(node* temp);
void showleveltree(node* temp);
void insertnode(node* newNode, node* temp);
bool findNode(node* temp, int target);//按值查找
node* findNode(node* temp, node* aimNode);//按节点查找
void deletenode(node* temp, int num);//删除指定叶子节点
void deleteLnode(node* temp, int num, node* father);//删除左子树不为空,右子树为空的节点
void deleteRnode(node* temp, int num);//删除左子树为空,右子树不为空的节点
void modify(node* temp, int num);//修改指定节点
};
//class Solution {//查找节点
//public:
// int kthLargest(node* root, int k) {
// vector<int> nums;
// if (root == NULL)
// return 0;
// queue<node*> q;
// q.push(root);
// while (!q.empty())
// {
// node* curr = q.front();
// nums.push_back(curr->data);
// q.pop();
// if (curr->left) q.push(curr->left);
// if (curr->right) q.push(curr->right);
// }
// sort(nums.begin(), nums.end(), greater<int>());
// return nums[k - 1];
// }
//};
void create2tree::create2Tree(node* &temp) {//创建二叉树执行完之后temp依然是根节点
int ch;
cin >> ch;
if (ch == 0) {
temp = new node();
temp->data = ch;
temp->left = NULL;
temp->right = NULL;
return;
}
else {
temp = new node();
temp->data = ch;
create2Tree(temp->left);
create2Tree(temp->right);
}
}
void create2tree::insertnode(node* newNode, node* temp) {//插入节点创建二叉树
int data;
node* p = temp;
if (p->data < newNode->data)
{
if (p->right == NULL)
p->right = newNode;
else insertnode(newNode, p->right);
}
else if (p->data > newNode->data)
{
if (p->left == NULL)
p->left = newNode;
else insertnode(newNode, p->left);
}
else return;
}
void create2tree::showfirsttree(node* temp) {//前序遍历执行完之后temp依然是根节点
cout << temp->data << " ";
if(temp->left!= NULL)
showfirsttree(temp->left);
if (temp->right != NULL)
showfirsttree(temp->right);
}
void create2tree::showmidtree(node* temp) {
if (temp->left != NULL)
showmidtree(temp->left);
cout << temp->data << " ";
if (temp->right != NULL)
showmidtree(temp->right);
}
void create2tree::showfinaltree(node* temp) {
if (temp->left != NULL)
showfinaltree(temp->left);
if (temp->right != NULL)
showfinaltree(temp->right);
cout << temp->data << " ";
}
//按值查找
bool create2tree::findNode(node* temp, int target) {
if (temp->data < target) {
//temp = temp->right;
findNode(temp->right, target);
}
else if (temp->data > target) {
//temp = temp->left;
findNode(temp->left, target);
}
else if (temp == NULL)
{
cout << "查无此节点" << endl;
return 0;
}
else if (temp->data == target) {
return true;
}
}
node* create2tree::findNode(node* temp, node* aimNode) {
if (temp->data < aimNode->data) {
//temp = temp->right;
findNode(temp->right, aimNode);
}
else if (temp->data > aimNode->data) {
//temp = temp->left;
findNode(temp->left, aimNode);
}
else if (temp == NULL)
{
cout << "查无此节点" << endl;
return 0;
}
else if (temp->data == aimNode->data) {
return aimNode;
}
}
void create2tree::showleveltree(node* temp) {
queue<node*>q;
while (temp!= NULL) {
cout << temp->data <<" ";
if (temp->left != NULL)
{
q.push(temp->left);
}
if (temp->right != NULL)
{
q.push(temp->right);
}
if (q.empty()) return;
temp = q.front();
q.pop();
}
}
void create2tree::deletenode(node* temp, int num) {
//情况一:二叉树,删除叶子节点
node* p = temp;
if (p->right != NULL &&p->data < num&&p->right->data!=num) {
deletenode(p->right, num);
}
else if (p->left != NULL &&p->data > num&&p->left->data != num) {
deletenode(p ->left, num);
}
else if (p == NULL)
{
cout << "查无此节点" << endl;
}
if (p->left!=NULL&&p->left->data == num) {
p->left = NULL;
}
else if (p->right != NULL && p->right->data == num) {
p->right = NULL;
}
}
void create2tree::modify(node* temp, int num) {
int data;
//node* p = temp;
//node* newtemp = temp;
//cout << temp->data << endl;
while (temp != NULL) {
//p = temp;
if (temp->data < num) {
if (temp != NULL)
{
temp = temp->right;
}
}
else if (temp->data > num) {
if (temp != NULL)
{
temp = temp->left;
}
}
else if (temp->data == num) {
cout << "请输入修改后的值" << endl;
cin >> data;
temp->data = data;
}
}
}
void create2tree::deleteLnode(node* temp, int num,node* father) {//删除左子树不为空,右子树为空的节点;//删除左子树为空,右子树不为空的节点
node* p = temp;
if (p->left != NULL && p->right != NULL) {
if (p->data < num) {
father = p;
deleteLnode(p->right, num, father);
}
else if (p->data > num) {
father = p;
deleteLnode(p->left, num, father);
}
}
删除左子树不为空,右子树为空的节点
if (p->left != NULL && p->right == NULL&&father->data>p->data) {
father->left = p->left;
}
else if (p->left != NULL && p->right == NULL && father->data < p->data) {
father->right = p->left;
}
//删除左子树不为空,右子树为空的节点
if (p->right != NULL && p->left == NULL) {
father->right = p->right;
}
}
int main() {
//创建二叉树
create2tree tree;
int num;
node* temp = new node();
temp->data = 50;
temp->left = NULL;
temp->right = NULL;
//node* acceptNode = new node();
int choose;
while (1) {
cout << "输入你的选择" << endl;
cout << "********************************************************************************" << endl;
cout << "1、前序遍历方式创建二叉树 2、前序遍历 3、中序遍历 4、后序遍历 5、层序遍历 " << endl;
cout << "6、按值查找节点 7、按节点查找、8、二叉树插入节点 9、删除叶子节点 10、修改节点 11、退出" << endl;
cout << "12、删除左子树不为空,右子树为空的节点 13、删除左子树为空,右子树不为空的节点 14、删除左右子树都不为的节点" << endl;
cout << "********************************************************************************" << endl;
cin >> choose;
node* newNode = new node();
node* aimNode = new node();
switch (choose) {
case 1:
cout << "请输入要创建的节点数值" << endl;
tree.create2Tree(temp);
continue;
case 2:
cout << "前序遍历" << endl;
tree.showfirsttree(temp);
cout << endl;
continue;
case 3:
cout << "中序遍历" << endl;
tree.showmidtree(temp);
cout << endl;
continue;
case 4:
cout << "后序遍历" << endl;
tree.showfinaltree(temp);
cout << endl;
continue;
case 5:
//node* newNode1 = new node();
//newNode1 = temp;
cout << "层序遍历" << endl;
tree.showleveltree(temp);
cout << endl;
continue;
case 6:
//二叉树中查找数据
cout << "要查找的节点数值" << endl;
cin >> num;
cout << "查找后的结果:1、查到 0、未查到" << endl;
cout << tree.findNode(temp, num) << endl;
continue;
case 7:
//二叉树中按节点查找
aimNode = temp;
cout << "请输入待查找节点的数值" << endl;
cin >> num;
aimNode->data = num;
if (tree.findNode(temp, aimNode)->data == aimNode->data) {
cout << "已找到目标节点" << endl;
};
continue;
case 8:
//二叉树中插入节点
//node* newNode = new node();
cout << "请输入插入新节点的数值" << endl;
cin >> num;
newNode->data = num;
newNode->left = NULL;
newNode->right = NULL;
tree.insertnode(newNode,temp);
continue;
case 9:
//在二叉树中删除指定节点
cout << "删除节点的值" << endl;
cin >> num;
tree.deletenode(temp, num);
continue;
case 10:
cout << "请输入要修改的节点" << endl;
cin >> num;
tree.modify(temp,num);
continue;
case 11:
break;
case 12:
node* father = new node();
father = temp;
cout << "删除节点的值" << endl;
cin >> num;
tree.deleteLnode(temp, num,father);
continue;
}
}
system("pause");
return 0;
}