二叉树:
#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;
}
/*
查找二叉树(二叉查找树,二叉搜索树)
左孩子 < 父节点 < 右孩子
如果使用中序遍历 得出来的是树排序后的结果(强迫症狂喜)
*/