二叉树的那些事
  • 板块学术版
  • 楼主HYQ1234
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/3/4 21:46
  • 上次更新2023/10/23 23:03:09
查看原帖
二叉树的那些事
926328
HYQ1234楼主2023/3/4 21:46

二叉树:

#include<iostream>
#include<queue>
using namespace std;
struct Node{
	int data;
	Node* left;
	Node* right;
}; 
void create(Node** tree){
	if(*tree == nullptr){
		int data;
		cin >> data;
		if(data == -1)
			return;
		*tree = new Node;
		(*tree)->data = data;
		(*tree)->left = nullptr;
		(*tree)->right = nullptr;
		create(&(*tree)->left);
		create(&(*tree)->right);
	}
}
// 深度优先搜索 
void front(Node* tree){
	if(tree == nullptr)
		return;
	cout << tree->data << " ";
	front(tree->left);
	front(tree->right);
}
void mid(Node* tree){
	if(tree == nullptr)
		return;
	mid(tree->left);
	cout << tree->data << " ";
	mid(tree->right);
}
void back(Node* tree){
	if(tree == nullptr)
		return;
	back(tree->left);
	back(tree->right);
	cout << tree->data << " ";
}
// 广度优先搜索 
void bfs(Node* tree){
	if(tree == nullptr)
		return;
	queue<Node*> que;
	que.push(tree);
	while(!que.empty()){
		if(que.front()->left != nullptr)
			que.push(que.front()->left);
		if(que.front()->right != nullptr)
			que.push(que.front()->right);
		cout << que.front()->data << " ";
		que.pop();
	}
}
int main(){
	Node* tree = nullptr;
	cout << "请输入树:";
	create(&tree);
	cout << endl << "前序遍历:";front(tree);cout << endl;
	cout << endl << "中序遍历:";mid(tree);cout << endl;
	cout << endl << "后序遍历:";back(tree);cout << endl;
	cout << endl << "层度遍历:";bfs(tree);cout << endl;
    return 0;
}
/*
3 2 1 -1 4 -1 -1 -1
5 7 -1 -1 8 -1 -1
*/

查找二叉树:

#include<iostream>
#include<cstring>
using namespace std;
struct Node{
	char* data;
	Node* left;
	Node* right;
};
void insert(Node** root,const char* data){
	if(*root == nullptr){
		*root = new Node;
		(*root)->data = new char[100];
		strcpy((*root)->data,data);
		(*root)->left = nullptr;
		(*root)->right = nullptr;
		return;
	}
	if(strcmp(data,(*root)->data) == 1)
		insert(&(*root)->right,data);
	else if(strcmp(data,(*root)->data) == -1)
		insert(&(*root)->left,data);
}
bool find(Node* tree,const char* data){
	if(tree == nullptr)
		return false;
	int b = strcmp(tree->data,data);
	if(b == 1)
		return find(tree->left,data);
	else if(b == -1)
		return find(tree->right,data);
	return true;
}
void mid(Node* tree){
	if(tree == nullptr)
		return;
	mid(tree->left);
	cout << tree->data << endl;
	mid(tree->right);
}
void erase(Node** tree,const char* data){
	if(*tree == nullptr)
		return;
	Node* _deleteNode = *tree;
	Node* _prevNode = nullptr;
	while(_deleteNode != nullptr){
		Node* _tmp = _deleteNode;
		int b = strcmp(_deleteNode->data,data);
		if(b == -1)
			 _deleteNode = _deleteNode->right;
		else if(b == 1)
			_deleteNode = _deleteNode->left;
		else
			break;
		if(_deleteNode != nullptr)
			_prevNode = _tmp;
	}
	if(_deleteNode == nullptr)
		return;
	if(_deleteNode->left == nullptr && _deleteNode->right == nullptr){
		if(_prevNode == nullptr)
			*tree = nullptr;
		else{
			int b = strcmp(_prevNode->data,_deleteNode->data);
			if(b == 1)
				_prevNode->left = nullptr;
			else if(b == -1)
				_prevNode->right = nullptr;
		}
		delete []_deleteNode->data;
		delete _deleteNode;
		return;
	}
	else if(_deleteNode->left != nullptr && _deleteNode->right == nullptr){
		if(_prevNode == nullptr)
			*tree = _deleteNode->left;
		else{
			int b = strcmp(_prevNode->data,_deleteNode->data);
			if(b == 1)
				_prevNode->left = _deleteNode->left;
			else if(b == -1)
				_prevNode->right = _deleteNode->left;
		
		}
		delete [] _deleteNode->data;
		delete _deleteNode;
		return;
	}
	else if(_deleteNode->left == nullptr && _deleteNode->right != nullptr){
		if(_prevNode == nullptr)
			*tree = _deleteNode->right;
		else{
			int b = strcmp(_prevNode->data,_deleteNode->data);
			if(b == 1)
				_prevNode->left = _deleteNode->right;
			else if(b == -1)
				_prevNode->right = _deleteNode->right;
			
		}
		delete [] _deleteNode->data;
		delete _deleteNode;
		return;
	}
	else{
	    Node* _prev = _deleteNode;
	    Node* _nextNode = _deleteNode->left;
	    while(_nextNode->right != nullptr){
	    	_prev = _nextNode;
	    	_nextNode = _nextNode->right;
		}
		_prev->right = _nextNode->left;
		_nextNode->left = _deleteNode->left;
		_nextNode->right = _deleteNode->right;
		if(_prev == nullptr)
			*tree = _nextNode;
		else{
			int b = strcmp(_prevNode->data,_nextNode->data);
			if(b == 1)
				_prevNode->left = _nextNode;
			else if(b == -1)
				_prevNode->right = _nextNode;	
		}
		
		delete [] _deleteNode->data;
		delete _deleteNode;
		return;
	}
}
int main(){
	Node* tree = nullptr;
	/*
	insert(&tree,"minecraft");
	insert(&tree,"creative");
	insert(&tree,"rectangle");
	erase(&tree,"minecraft");
	*/
	insert(&tree,"hi");
	insert(&tree,"hello");
	insert(&tree,"happy");
	erase(&tree,"happy");
	mid(tree);
    return 0;
}
/*
查找二叉树(二叉查找树,二叉搜索树) 
左孩子 < 父节点 < 右孩子 
如果使用中序遍历 得出来的是树排序后的结果(强迫症狂喜) 
*/
2023/3/4 21:46
加载中...