二叉树
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);
}
二叉树大致就这么多,有错误或者遗漏的欢迎纠正或补充