二叉树的创建与遍历(递归版本)

简介:

非递归方式实现二叉树的创建与搜索,对于二叉树通常约定以前序遍历方式输入,若输入不正确是不会有什么显示的,这点要注意;

给出了C语言创建链表的俩种方式(不同于C++中引用传递)

一 创建二叉树方式:

方式一:输入指针

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void creatBT(BiTree *T)//建立一个二叉树  
  2. {  
  3.     char ch;  
  4.     scanf("%c",&ch);//读入字符  
  5.     if(ch=='.')//.代表空子树  
  6.         *T = NULL;  
  7.     else  
  8.     {  
  9.         *T = (node *)malloc(sizeof(node));  
  10.         if(!T)  
  11.         {  
  12.             printf("开辟内存失败\n");  
  13.             exit(1);  
  14.         }  
  15.         (*T)->data = ch;//给T赋值  
  16.         creatBT(&(*T)->lchild);//给左子树赋值  
  17.         creatBT(&(*T)->rchild);//给右子树赋值  
  18.     }  
  19. }  

方式二:无参数传入,返回局部函数的指针地址

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. BiTree creatBT()//建立一个二叉树  
  2. {  
  3.     BiTree T;  
  4.     char ch;  
  5.     scanf("%c",&ch);//读入字符  
  6.     if(ch=='.')//.代表空子树  
  7.         T = NULL;  
  8.     else  
  9.     {  
  10.         T = (node *)malloc(sizeof(node));  
  11.         if(!T)  
  12.         {  
  13.             printf("开辟内存失败\n");  
  14.             exit(1);  
  15.         }  
  16.         T->data = ch;//给T赋值  
  17.         T->lchild = creatBT();//给左子树赋值  
  18.         T->rchild = creatBT();//给右子树赋值  
  19.     }  
  20.     return T;  
  21. }  

二 遍历代码(采取方式一的创建方式)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. //定义二叉树的数据结构(递归方式)  
  4. typedef struct node  
  5. {  
  6.     char data;  
  7.     struct node *lchild;  
  8.     struct node *rchild;  
  9. }node ,*BiTree;  
  10. void creatBT(BiTree *T)//建立一个二叉树  
  11. {  
  12.     char ch;  
  13.     scanf("%c",&ch);//读入字符  
  14.     if(ch=='.')//.代表空子树  
  15.         *T = NULL;  
  16.     else  
  17.     {  
  18.         *T = (node *)malloc(sizeof(node));  
  19.         if(!T)  
  20.         {  
  21.             printf("开辟内存失败\n");  
  22.             exit(1);  
  23.         }  
  24.         (*T)->data = ch;//给T赋值  
  25.         creatBT(&(*T)->lchild);//给左子树赋值  
  26.         creatBT(&(*T)->rchild);//给右子树赋值  
  27.     }  
  28. }  
  29. void pre_order(node *T)//前序遍历二叉树  
  30. {  
  31.     if(T)  
  32.     {  
  33.         printf("%c ",T->data);  
  34.         pre_order(T->lchild);  
  35.         pre_order(T->rchild);  
  36.     }  
  37.   
  38. }  
  39. void mid_order(node *T)//中序遍历  
  40. {  
  41.     if(T)  
  42.     {  
  43.         mid_order(T->lchild);  
  44.         printf("%c ",T->data);  
  45.         mid_order(T->rchild);  
  46.     }  
  47.   
  48. }  
  49. void back_order(node *T)  
  50. {  
  51.     if(T)  
  52.     {  
  53.         back_order(T->lchild);  
  54.         back_order(T->rchild);  
  55.         printf("%c ",T->data);  
  56.     }  
  57.   
  58. }  
  59. int main()  
  60. {  
  61.     BiTree T = NULL;  
  62.     printf("请使用前序遍历的方式输入字符串,用.代替空值\n");  
  63.     creatBT(&T);//建立二叉树  
  64.     printf("建树成功\n");  
  65.     printf("\n前序遍历的结果是:\n");  
  66.   
  67.     pre_order(T);  
  68.     printf("\n中序遍历的结果是:\n");  
  69.     mid_order(T);  
  70.     printf("\n后序遍历的结果是:\n");  
  71.     back_order(T);  
  72.     printf("\n");  
  73.     system("pause");  
  74.     return 0;  
  75. }  


若要采取方式二的创建方式main函数对应修改为

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     BiTree T = NULL;  
  4.     printf("请使用前序遍历的方式输入字符串,用.代替空值\n");  
  5.     T = creatBT();//建立二叉树  
  6.     printf("建树成功\n");  
  7.     printf("\n前序遍历的结果是:\n");  
  8.   
  9.     pre_order(T);  
  10.     printf("\n中序遍历的结果是:\n");  
  11.     mid_order(T);  
  12.     printf("\n后序遍历的结果是:\n");  
  13.     back_order(T);  
  14.     printf("\n");  
  15.     system("pause");  
  16.     return 0;  
  17. }  

结果一样的

小结:采用有参传入的时候由于在局部函数执行完后变量都会被释放,因此需要传入BiTree的指针,因而比较复杂,建议使用无参书传入,返回头节点,代码比较简洁容易理解


转载:http://blog.csdn.net/xsf50717/article/details/40019023

目录
相关文章
|
6月前
|
Java
二叉排序树的三种遍历方式和实现源代码
二叉排序树的三种遍历方式和实现源代码
91 0
|
7月前
|
存储 算法
二叉树的创建和遍历
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分
62 0
|
11月前
|
机器学习/深度学习 C++ 容器
C++实现的二叉树创建和遍历,超入门邻家小女也懂了
C++实现的二叉树创建和遍历,超入门邻家小女也懂了
75 0
|
11月前
|
存储 编译器
二叉树的递归遍历与迭代遍历(图示)
本文将讲述二叉树递归与迭代的相关知识。
80 0
|
11月前
|
机器学习/深度学习 C++ 容器
二叉树创建和遍历(C++实现)
树(Tree)是n(n≥0)个节点的有限集。在任意一棵树中有且仅有一个特定的称为根(Root)的节点;当n>1时,其余节点可分m(m>0)为个互不相交的有限集T1,T2,...,Tm;其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 二叉树(Binary Tree)是一种特殊的有序树型结构,所有节点最多只有2棵子树。
407 0
二叉树的三种遍历方式
二叉树的三种遍历方式
188 0
二叉树的三种遍历方式
二叉树的创建,和三种递归遍历方式
二叉树的创建,和三种递归遍历方式
|
Python
python实现二叉树的创建和遍历
python实现二叉树的创建和遍历
251 0