数据结构学习之二叉树
二叉树定义:
1)每个节点最多有两个子节点的树形结构
2)起始节点叫根节点,除了根节点,每个节点有只有同一个父节点
3)没有任何子节点的节点叫做叶子节点,除了叶子节点之外,每个节点都可以有两个子节点
4)除了根节点和叶子节点外,剩下的
5)叉树中每层节点均达到最大值,并且除了叶子节点之外每个节点都有两个子节点,叫做满二叉树
6)二叉树中除了最后一层之外,每层节点数均达到最大值,并且最后一层的节点连续集中在左边,叫完全二叉树
遍历方式:
先序遍历 根 左子树 右子树
中序遍历 左子树 根 右子树
后序遍历 左子树 右子树 根
二叉树节点的创建
首先判断传入的结构为空,为空的话就插入根节点,判断插入节点的值是否大于根节点的值,如果大于根节点就通过递归调用 insert_node函数放在右边,小于根节点通过递归调用 insert_node函数放在左边。
//插入新节点
void insert_node(Tree ** tree,int data)
{
Tree *Tmp=malloc(sizeof(Tree));
if(Tmp==NULL)
{
printf("create node fail\r\n");
return ;
}
if(!(*tree)) //为空则插入根节点
{
Tmp->left=Tmp->right=NULL;
Tmp->data=data;
*tree=Tmp;
return ;
}
if(data<(*tree)->data)
{
insert_node(&(*tree)->left,data);
}
else if(data>(*tree)->data)
{
insert_node(&(*tree)->right,data);
}
}
节点删除
void delete_node(Tree * tree)
{
if(tree)
{
delete_node(tree->left);
delete_node(tree->right);
free(tree);
}
}
前序遍历
void print_preorder(Tree * tree)
{
if(tree)
{
printf("%d\n",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
中序遍历
void print_inorder(Tree *tree)
{
if(tree)
{
print_inorder(tree->left);
printf("%d\n",tree->data);
print_inorder(tree->right);
}
}
后序遍历
void print_postorder(Tree * tree)
{
if(tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%d\n",tree->data);
}
}
使用上面的函数来构造上图中的二叉搜索树,并使用上面的三种遍历
//节点数据类型
struct Node
{
int data;
struct Node *left;//左子树
struct Node *right;//右子树
};
typedef struct Node Tree;
//插入新节点
void insert_node(Tree ** tree,int data)
{
Tree *Tmp=malloc(sizeof(Tree));
if(Tmp==NULL)
{
printf("create node fail\r\n");
return ;
}
if(!(*tree)) //为空
{
Tmp->left=Tmp->right=NULL;
Tmp->data=data;
*tree=Tmp;
return ;
}
if(data<(*tree)->data)
{
insert_node(&(*tree)->left,data);
}
else if(data>(*tree)->data)
{
insert_node(&(*tree)->right,data);
}
}
//前序遍历
void print_preorder(Tree * tree)
{
if(tree)
{
printf("%d\n",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
//中序遍历
void print_inorder(Tree * tree)
{
if(tree)
{
print_inorder(tree->left);
printf("%d\n",tree->data);
print_inorder(tree->right);
}
}
//后序遍历
void print_postorder(Tree * tree)
{
if(tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%d\n",tree->data);
}
}
//删除节点
void delete_node(Tree * tree)
{
if(tree)
{
delete_node(tree->left);
delete_node(tree->right);
free(tree);
}
}
//搜索
Tree * search_node(Tree ** tree,int val)
{
if(!(*tree))
{
return NULL;
}
if(val==(*tree)->data)
return *tree;
else if(val<(*tree)->data)
search_node(&(*tree)->left,val) ;//小于的话左边找
else if(val>(*tree)->data)
{
search_node(&(*tree)->right,val) ;//大于的话右边找
}
}
int main()
{
Tree *root=NULL;
Tree *Tmp;
insert_node(&root,7);
insert_node(&root,4);
insert_node(&root,9);
insert_node(&root,2);
insert_node(&root,6);
insert_node(&root,8);
insert_node(&root,10);
insert_node(&root,1);
insert_node(&root,3);
insert_node(&root,5);
/* Printing nodes of tree */
printf("前序遍历:\r\n");
print_preorder(root);
printf("\r\n中序遍历\r\n");
print_inorder(root);
printf("\r\n后序遍历\r\n");
print_postorder(root);
}