vlambda博客
学习文章列表

数据结构学习之二叉树


  • 二叉树定义:

         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); }}

使用上面的函数来构造上图中的二叉搜索树,并使用上面的三种遍历

#include <stdio.h>#include <stdlib.h>//节点数据类型 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);
}