链式二叉树

本文介绍了链式二叉树的基本概念,包括定义、创建、添加元素以及前序、中序、后序三种排序方式的遍历规则。同时,提到了在遍历过程中递归的重要应用。
摘要由CSDN通过智能技术生成

链式二叉树


定义和函数申明

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#define TYPE int 
typedef struct Node
{                           
	TYPE data;    
	struct Node* left;    
	struct Node* right;
}Node;
//创建
Node* creat_node(TYPE data);
//添加
bool add_tree(Node* root,TYPE data);
//访问辅助函数
void _access_tree(Node* root,size_t i,TYPE* p,size_t* indexp)//访问
bool access_tree(Node* root,size_t i,TYPE* p);
//前序
void prev_show(Node* root);
//中序
void in_show(Node* root);
//后序
void post_show(Node* root);
//高度
size_t high_tree(Node* root);
//密度
size_t density_tree(Node* root);

  • 创建
Node* creat_node(TYPE data)
{    
	Node* node = malloc(sizeof(Node));    
	node->data = data;    
	node->left = NULL;   
	 node->right = NULL;    
	 return node;
}

  • 添加
bool add_tree(Node* root,TYPE data)
{    
	if(NULL == root)return false;        
	if(root->data > data)    
	{       
	 if(NULL == root->left)        
	 	{            
	 	root->left = creat_node(data);            r
	 	return true;       
	  	}       
	  	add_tree(root->left,data);    
	 }   
	  else    
	 {       
	if(NULL ==root->right)        
	 	 {            
	  	root->right = creat_node(data);            
	  	return true;        
	  	 }        
	  	add_tree(root->right,data);     
	 }
}

  • 访问
//访问辅助函数
void _access_tree(Node* root,size_t i,TYPE* p,size_t* indexp)
{
	if(NULL == root) return;
	_access_tree(root->left,i,p,indexp);
	if(i == *indexp)
	{
		*p = root->data;
		*indexp +=1;
		return;
	}
	*indexp += 1;
	_access_tree(root->right,i,p,indexp);
}
//访问
bool access_tree(Node* root,size_t i,TYPE* p)
{
	if(i >= density_tree(root)) return false;
	size_t index =0;
	_access_tree(root,i,p,&index);
	return true;
}

bool access_tree(Node* root,size_t i,TYPE* p);
void _access_tree(Node* root,size_t i,TYPE* p,size_t* indexp);
Node* root : 传递的根结点
size_t i :要访问的下标
size_t indexp: 判断下标
TYPE* p : 传输访问的值(用来判断是否访问成功)


  • 三种排序
//前序
void prev_show(Node* root)
{
   if(NULL == root) return ;
   printf("%d ",root->data);
   prev_show(root->left);
   prev_show(root->right);
}
//中序
void in_show(Node* root)
{
   if(NULL == root) return ;
   in_show(root->left);
   printf("%d ",root->data);
   in_show(root->right);
}
//后序
void post_show(Node* root)
{
   if(NULL == root) return ;
   post_show(root->left);
   post_show(root->right);
   printf("%d ",root->data);
}

前序的规则是根左子右子
后序的规则是左子右子根
中序的规则是左子根右子


  • 高度和密度
//高度
size_t high_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(Node* root)
{
   if(NULL == root) return 0;
   return 1+density_tree(root->left)+density_tree(root->right);	
}

在链式二叉树的添加和三序的时候都要使用递归的运用所谓的递归就是函数自己调用自己然后在一层层的返回回去的过程这在二叉树中是十分重要的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值