链式二叉树
定义和函数申明
#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);
}
在链式二叉树的添加和三序的时候都要使用递归的运用所谓的递归就是函数自己调用自己然后在一层层的返回回去的过程这在二叉树中是十分重要的