从零开始的二叉树

二叉树

1、子结点的数量最多为2的树叫做二叉树

2.、相关术语:

				前序遍历: 根结点,左结点,右结点
				中序遍历: 左结点,根结点,右结点
				后序遍历: 左结点,右结点,根结点
				层序遍历: 从上到下,从左到右

3、二叉树的构成

在这里插入图片描述
最上面的结点为根结点(root),第二层的结点为根结点的子节点,也是第三层的父结点,第三层为第二层的子结点,其余的叫做边。结点和链表中的结点一样可以存储数据。树中的边通常用C或者C++里面的指针来实现。

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include"queue_list.h"//这是后面再使用层序遍历时会要用到的队列
#define TYPE int

创建结点

Tree_Node* creat_node(TYPE data)
{
	Tree_Node* node = malloc(sizeof(Tree_Node));
	node->data = data;
	node->left = NULL;
	node->right = NULL;
	return node;
}

添加

void _add_tree(Tree_Node** root,Tree_Node* node)
{
	if(NULL == *root)
	{
	*root = node;
	return;
	}
	if((*root)->data > node->data)
		_add_tree(&(*root)->left,node);
	else
		_add_tree(&(*root)->right,node);
}

void add_tree(Tree_Node** root,TYPE data)
{
	_add_tree(root,creat_node(data));
}

删除结点

bool del_tree(Tree_Node** root,TYPE data)
{
if(NULL == *root)return false;
if((*root)->data == data)
	{
	Tree_Node* node = *root;
	*root = node->left;
	_add_tree(root,node->right);
	return true;
	}
	else if((*root)->data > data)
	return del_tree(&(*root)->left,data);
		else
		return del_tree(&(root)->right,data);

} 

访问

bool access_tree(Tree_Node* root,size_t i,TYPE*p)
{
if(NULL == root)return false;
	static size_t index;
	access_tree(root->left,i,p);
	if(i == index)
	{
		printf("%d ",root->data);
		index = 0;
		return true;
	}
	index++;
	access_tree(root->right,i,p)
}

前序

void prev_show(Tree_Node* root)
{
	if(NULL == root) return;
	printf("%d ",root->data);
	prev_show(root->left);
	prev_show(root->right);
	}

中序

void in_show(Tree_Node* root)
{
	if(NULL == root)return;
	in_show(root->left);
	printf("%d ",root->data);
	in_show(root->right);
	}

后序

void post_show(Tree_Node* root)
{
	if(NULL == root)return;
	post_show(root->left);
	post_show(root->right);
	printf("%d ",root->data);
	}

层序

void level_show(Tree_Node* root)
{
	Queue* queue = creat_queue();
	push_queue(queue,root);
	
	while(!empty_queue(queue))
	{
		Tree_Node* node = *head_queue(queue);
		printf("%d ",node->data);
		if(node->left) push_queue(queue,node->left);
		if(node->right) push_queue(queue,node->right);
		pop_queue(queue);
	}
	printf("\n");	
	}

高度

size_t high_tree(Tree_Node* root)
{
	if(NULL == root)return 0;
	size_t lh = high_tree(root->left);
	size_t rh = high_tree(root->right);

	return lh>rh?lh+1:rh+1;
	}

密度

size_t density_tree(Tree_Node* root)
{
	if(NULL == root)return 0;
	return 1+density_tree(root->left)+density_tree(root->right);
	}

二叉树大致就这么多,有错误或者遗漏的欢迎纠正或补充

猜你喜欢

转载自blog.csdn.net/weixin_45050225/article/details/96319112