数据结构学习之二叉树
二叉树定义:
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);}
