对于递归,这里面的分析最好当然是用图形的方式来分析了.这里来总结一下



1.首先对于栈的理解:

先进后出,后进先出

先进后出

2.在进行非全然二叉树的存储之后,我们要做的是对其进行遍历或者索引,查找某个孩子,或某个左孩子或右孩子的双亲,不然存了是徒劳的.

非全然二叉树的存储:

我觉得最好的存储方式是动态链表,静态链表仅仅有在某些很特殊的情况下才行得通的选择,比方说已知这个二叉树就是这样,不会再改变

而对于动态链表,我觉得最好的方式是建立5个指针,一个数据域,这五个指针各自是:*lchild(左孩子),*rchild(右孩子) ,*
parent(双亲) ,*node(指向结构体)  ,*p(暂时指针)

如图所看到的:

标准结构:

树:

结构:

遍历方式:

DLR,

LDR,

LRD.  这三种为正序遍历 (先左子)

DRL,

RDL,

RLD. 这三种为逆序遍历  (先右子)

多层递归方式:

举例:

以DLR遍历方式来举例:

递归第一层:     訪问1,  左孩子是否有 ?

有,进入一下曾...       A  ..右孩子推断被搁置

递归等二层:    訪问2, 此时 2被视为 根, 左孩子是否有 ?

有,进入下一层....   B ..右孩子推断被搁置

递归第三层:   訪问4 ,此时 4被视为根 ,左孩子 是否有?

有,进入下一层 ... C  .右孩子推断被搁置

递归第四层:   訪问8 ,此时 8被视为 根 ,左孩子是否有? 没有  D.. 右孩子推断: 没,回到 C 返回第三层 被搁置的推断

回到第三层:  4 右孩子是否有?

有.. 进入下一层

递归到新第四层:  9被视为根 ,是否有 左孩子?

没有  E: 是否有右孩子 ?

没有  回到第三层

回到第三层:  语句运行完成, 回到第二层..... .

递归第二层:  2 的右子树 : 有 为 5, 进入新的 第三层 递归

递归到新的第三层: 5 被视为根 , 5的左子树? 没 , 5的右 子树?

没 回到第二层 ..

回到第二层:  第二层语句所有运行完成 回到第一层

递归第一层:
 1 的右孩子? 有 进入新的一层:

新的第二层:  1的右孩子3 被视为 根, 是否有左孩子? 没 是否有右孩子 ?

没 回到第一层

回到第一层: 所有完成

递归运行完成

04 #include
<stdlib.h>
05 #include
<malloc.h>
06 #include
<stdio.h>
07 typedef struct node
08 {
09     char data;
10     struct node
*lchild;
11     struct node
*rchild;
12 }*BiTree;
13  
14 void creatBT(BiTree
&T)
//建立二叉树函数
15 {
16     char ch;
17     scanf("%c",&ch);
18     if(ch=='.')
19     {
20         T=NULL;//  
.空子树;
21     }
22     else
23     {
24         T=(node
*)
malloc(sizeof(node));//分配空间
25         if(!T)exit(0);
26         T->data
= ch;
//T赋值
27         creatBT(T->lchild);//左子树赋值
28         creatBT(T->rchild);//右子树赋值
29     }
30 }
31  
32 void pre_order(node
*T)
//前序遍历
33 {
34     if(T)
35     {
36         printf("%c
"
,T->data);
37         pre_order(T->lchild);
38         pre_order(T->rchild);
39     }
40  
41 }
42  
43 void mid_order(node
*T)
//中序遍历
44 {
45     if(T)
46     {
47         mid_order(T->lchild);
48         printf("%c
"
,T->data);
49         mid_order(T->rchild);
50     }
51 }
52  
53 void behind_order(node
*T)
//后序遍历
54 {
55     if(T)
56     {
57         behind_order(T->lchild);
58         behind_order(T->rchild);
59         printf("%c
"
,T->data);
60     }
61 }
62  
63 int main()
64 {
65     node
*T;
66     printf("请按先序序列输入一串字符,当子树为空时,输入.\n");
67     creatBT(T);//建树
68     printf("建树成功,T指向二叉树的根!\n");
69  
70     printf("\n前序遍历二叉树的结果:");
71     pre_order(T);
72  
73     printf("\n中序遍历二叉树的结果:");
74     mid_order(T);
75  
76     printf("\n后序遍历二叉树的结果:");
77     behind_order(T);printf("\n");
78      
79      
80     system("pause");
81      
82     return 0;
83 }

最新文章

  1. mobileControls与移动控件适配
  2. 【转】25个必须记住的SSH命令
  3. [Android]AndroidInject增加sqlite3数据库映射注解(ORM)
  4. db2删除数据库
  5. Unity中2D和UGUI图集的理解与使用
  6. 使用JS进行pc端、手机端判断
  7. FIFO 和 LRU 调度算法
  8. python中添加环境变量
  9. JavaScript 日期处理类库
  10. excel表格数据导入数据库Oracle
  11. 使用graphviz画图
  12. python_Tkinter
  13. python集合与字典的用法
  14. Military Problem CodeForces 1006E (dfs序)
  15. Internet Explorer 已限制此网页运行脚本或ActiveX控件。 允许阻止的内容(A)
  16. AFNetWorking 源码粗浅理解
  17. linuxbash 父进程 子进程
  18. 同步代码时忽略maven项目 target目录
  19. 【原】Nginx搭建FTP服务器的细节问题
  20. WCF实现将服务器端的错误信息返回到客户端

热门文章

  1. kb-07线段树-06离散化(与第四题类似)
  2. P3285 松鼠的新家 (树链剖分)
  3. 【hihocoder】欧拉路径 并查集判连通
  4. Python Base Two
  5. linux JDK安装(一)
  6. ajax提交数据服务端返回报错
  7. 加速和简化构建Docker(基于Google jib)
  8. Yii关联查询(转载)
  9. LeetCode OJ--Set Matrix Zeroes **
  10. MongoDB管理与监控