什么是二叉树
二叉树结构
二叉搜索树是能够高校进行如下操作的数据结构。
1,插入一个数值
2,查询是否包含某个值
3,删除某个值
像二叉树(如果有n个数据)每次操作的复杂度需要O(log n)的复杂度
二叉树的结构差不多为
它的遍历方式有前序,中序,后序,针对该图结果为:
前:2,1,5,4,15,10,8,11,17
中:1,2,4,5,7,8,10,11,15,17
后:1,4,5,2,8,11,10,17,15,7
这个排序方法就是前就是父节点在前,中就是父节点在中,后就是父节点在后。
二叉树的实现
前面逼逼赖赖这么长时间终于到重点了
想要构建二叉搜索树首先是要构建树的节点 ,这个结构体需要包含数据域存数,还需要左儿子,右儿子来指向下一个节点。
typedef struct node {
int data;
struct node* lson;//左儿子
struct node* rson;//右儿子
}Node;
然后还要定义树的结构体,在这里面需要有一个root(根)来储存根节点,所以这个根的类型应该是Node*类型储存。
typedef struct {
Node* root;
}Tree;
定义了结构体之后需要创建树,向树中添加数据
Node* node = (Node*)malloc(sizeof(Node));//申请一个大小为Node的节点
node->data = val;//val即为传入的数据
node->lson = NULL;
node->rson = NULL;
即定义一个Node*类型的结构体储存一下传进来的数据,把新定义的节点的左儿子右儿子都指向空
这已经把数据存在了一个节点里,然后向树里面存,需要然后需要判断根节点是否为空,如果为空就直接把新数据存到根节点
if (tree->root == NULL) {
tree->root = node;
}
这个是判断传进来的树的根节点
如果不为空则需要定义一个新的Node* temp节点存该树的根节点,然后把根节点当做普通节点来判断 我自己的理解如果不对希望指正(手动鞠躬感谢)
因为这是一座二叉搜索树,所以需要判断传入数据的大小后再存入该树中
if (val < temp->data) {//val即为传入的数据,val小于上一节点的数据,即存入左儿子
if (temp->lson == NULL) {//如果左儿子为空
temp->lson = node;//直接把新传入的节点传到上一节点的左儿子
return;
}
else {
temp = temp->lson;//如果不为空,则把记录上一次节点的temp更新为上一节点的左儿子进入下一次判断大小的循环,
}
}
else {//这是大于等于的时候
if (temp->rson == NULL) {
temp->rson = node;//直接传到右儿子
return;
}
else {
temp = temp->rson;//和左原理一样
}
}
因为只要temp不为空需要一直跑则加个while(temp!= 0){}让它一直循环就好,则完整代码为
void insert(Tree* tree,int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = val;
node->lson = NULL;
node->rson = NULL;
if (tree->root == NULL) {
tree->root = node;
}
else {
Node* temp = tree->root;
while (temp != NULL) {
if (val < temp->data) {
if (temp->lson == NULL) {
temp->lson = node;
return;
}
else {
temp = temp->lson;
}
}
else {
if (temp->rson == NULL) {
temp->rson = node;
return;
}
else {
temp = temp->rson;
}
}
}
}
return;
}
上述则为完整构建树的完整代码
然后我再上一下中序遍历,因为中序遍历可以让数从小到大来输出该二叉树
void mid(Node* node) {
if (node != NULL) {
mid(node->lson);
cout << node->data<<" ";
mid(node->rson);
}
}
接下来我就给出构建二叉树且遍历的完整代码
#include<algorithm>
#include<iostream>
using namespace std;
typedef struct node {
int data;
struct node* lson;
struct node* rson;
}Node;
typedef struct {
Node* root;
}Tree;
void insert(Tree* tree,int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = val;
node->lson = NULL;
node->rson = NULL;
if (tree->root == NULL) {
tree->root = node;
}
else {
Node* temp = tree->root;
while (temp != NULL) {
if (val < temp->data) {
if (temp->lson == NULL) {
temp->lson = node;
return;
}
else {
temp = temp->lson;
}
}
else {
if (temp->rson == NULL) {
temp->rson = node;
return;
}
else {
temp = temp->rson;
}
}
}
}
return;
}
void mid(Node* node) {
if (node != NULL) {
mid(node->lson);
cout << node->data<<" ";
mid(node->rson);
}
}
int main() {
int n;
Tree tree;
tree.root = NULL;
cin >> n;
for (int i = 0;i < n;i++) {
int temp;
cin >> temp;
insert(&tree,temp);
}
mid(tree.root);
}