二叉树的查找,创建,遍历,修改,删除

二叉树的查找、创建、遍历、修改、删除操作

#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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值