从零开始的二叉树

二叉树

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);
	}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值