此篇为原创,如需转载,请注明出处:http://blog.csdn.NET/qq_36759732
树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
通过此篇,你将会深入了解到树的基本操作,便于以后使用树时更加清楚。大家知道,对于树的操作,有插入,删除,遍历等,但它本质上是如何实现的呢,下面我会通过代码实现链表的基本操作。
为了便于解释,下面操作用二叉树实现。 //二叉树:每个节点最多含有两个子树的树称为二叉树; 编程环境:linux 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 using namespace std; 6 7 typedef struct node{ 8 int date; 9 struct node *lchild,*rchild; 10 }Node,*tree; 11 12 Node *init_tree(int date){ //初始化 13 Node *p = (Node *)malloc(sizeof(Node)); 14 p->date = date; 15 p->lchild = NULL; 16 p->rchild = NULL; 17 return p; 18 } 19 20 Node *insert_tree(tree bt,int value){ //插入 21 if(bt == NULL){ 22 bt = init_tree(value); 23 } 24 if(bt->date > value){ 25 bt->lchild = insert_tree(bt->lchild,value); 26 }else if(bt->date < value){ 27 bt->rchild = insert_tree(bt->rchild,value); 28 } 29 return bt; 30 } 31 32 Node *search_tree(tree bt,int value){ //查找 33 if(bt == NULL || bt->date == value){ 34 printf("已找到\n"); 35 return bt; 36 }else if(bt->date > value){ 37 return search_tree(bt->lchild,value); 38 }else{ 39 return search_tree(bt->rchild,value); 40 } 41 return bt; 42 } 43 44 void clear_tree(tree bt){ //清空 45 if(bt == NULL) return ; 46 clear_tree(bt->lchild); 47 clear_tree(bt->rchild); 48 free(bt); 49 } 50 51 Node *pro_indor(tree bt){ //前序遍历 52 if(bt == NULL) return bt; 53 printf("%d ",bt->date); 54 pro_indor(bt->lchild); 55 pro_indor(bt->rchild); 56 return bt; 57 } 58 59 Node *in_indor(tree bt){ //中序遍历 60 if(bt == NULL) return bt; 61 in_indor(bt->lchild); 62 printf("%d ",bt->date); 63 in_indor(bt->rchild); 64 return bt; 65 } 66 67 Node *pos_indor(tree bt){ //后续遍历 68 if(bt == NULL) return bt; 69 pos_indor(bt->lchild); 70 pos_indor(bt->rchild); 71 printf("%d ",bt->date); 72 return bt; 73 } 74 75 int main(){ 76 printf("/***************************************************/\n"); 77 printf("0代表插入,1代表查找,2代表先序遍历,3代表中序,4代表后序\n"); 78 printf("/***************************************************/\n"); 79 printf("\n"); 80 81 tree tree = NULL; 82 int opr,n,value; 83 while(scanf("%d",&opr)!=EOF){ 84 switch(opr){ 85 case 0: 86 printf("输入插入的值:"); 87 scanf("%d",&value); 88 tree = insert_tree(tree,value); 89 break; 90 case 1: 91 printf("输入查找的值:"); 92 scanf("%d",&value); 93 search_tree(tree,value); 94 break; 95 case 2: 96 printf("先序遍历:"); 97 pro_indor(tree); 98 printf("\n"); 99 break; 100 case 3: 101 printf("中序遍历:"); 102 in_indor(tree); 103 printf("\n"); 104 break; 105 case 4: 106 printf("后序遍历:"); 107 pos_indor(tree); 108 printf("\n"); 109 break; 110 } 111 } 112 clear_tree(tree); 113 return 0; 114 } 以上是本人对树操作的理解,欢迎大家指点与修正。后面我会上传关于各种排序的基本操作,大家敬请期待。