深度解析树操作

此篇为原创,如需转载,请注明出处: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 }



 

 以上是本人对树操作的理解,欢迎大家指点与修正。后面我会上传关于各种排序的基本操作,大家敬请期待。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值