二叉树的实现和中序遍历

什么是二叉树

二叉树结构

二叉搜索树是能够高校进行如下操作的数据结构。
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);
}

谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值