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



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 }

C递归算法与栈的分析,非全然二叉树遍历分析---ShinePans的更多相关文章

  1. Wireshark分析非标准端口号流量

    Wireshark分析非标准端口号流量 2.2.2  分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...

  2. 非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)

    非变动性算法代码分析与示例: 一.for_each  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14   // TEMPLATE FUNCTION for_eac ...

  3. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  4. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  5. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  6. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

  7. Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...

  8. Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...

  9. 8、SpringMVC源码分析(3):分析ModelAndView的形成过程

    首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...

随机推荐

  1. iOS学习笔记24-不断进化的屏幕适配

    一.屏幕适配 iOS的屏幕适配可以分为3大块,代表着不同时期的屏幕适配主流: AutoResizing:在iOS6之前,完全能够胜任,因为当时苹果只有3.5寸屏,加上比较少的支持横屏,它有非常大的局限 ...

  2. HDU-2768 Cat vs. Dog

    题意一开始是理解错的...结果就各种WA啦~ 对于两个观众,假如有某只宠物,一个人讨厌另一个人却喜欢,这两个人就是有矛盾的,连边. 最后求最小顶点覆盖.因为把这个覆盖点集去掉的话剩下的图中没有两个点是 ...

  3. BZOJ3534 [Sdoi2014]重建 【矩阵树定理】

    题目 T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回. 辛运的是,此前T国政府 ...

  4. P2258 子矩阵 (搜索,动态规划)

    题目链接 Solution 搜索+DP. 刚好把搜索卡死的数据范围... 然后应该可以很容易想到枚举行的情况,然后分列去DP. 行的情况直接全排列即可,复杂度最高 \(O(C_{16}^{8})\). ...

  5. JSON 序列化与弱类型

    一.C#中JSON序列化有多种方式: 使用“DataContractJsonSerializer ”类时需要, 1.引用程序集 System.Runtime.Serialization 和 Syste ...

  6. cogs2060 除法表达式

    http://blog.csdn.net/sdfzyhx/article/details/52254071 作为分母的数当然是越少越好.将x2作为分母,其他作为分子,不断约分,最后判断. /*by S ...

  7. POJ4007 Flood-it!

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 337   Accepted: 123 Description Flood ...

  8. WPF,布局,Menu,MenuItem,DockPanel,Grid,DockPanel.Dock='',ToolBar,Content,Image,Uri

    布局相关: Grid as title Binding Path="", Mode= TwoWay, model should implement IPropertyChanged ...

  9. Python初见

    参考资料:http://wenku.baidu.com/link?url=_akpT-G5Tvf7ECyszSipOAhHXzjlpYu-RWPcRTYp_tecPOollPGUxXG4MH69MLN ...

  10. Ui大屏

    http://www.uimaker.com/plus/view.php?aid=128661&pageno=1