对于递归,这里面的分析最好当然是用图形的方式来分析了.这里来总结一下
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 被视为 根, 是否有左孩子? 没 是否有右孩子 ?
没 回到第一层
回到第一层: 所有完成
递归运行完成
14 |
void creatBT(BiTree
&T)//建立二叉树函数 |
24 |
T=(node
*)malloc(sizeof(node));//分配空间 |
27 |
creatBT(T->lchild);//左子树赋值 |
28 |
creatBT(T->rchild);//右子树赋值 |
32 |
void pre_order(node
*T)//前序遍历 |
36 |
printf("%c
",T->data); |
43 |
void mid_order(node
*T)//中序遍历 |
48 |
printf("%c
",T->data); |
53 |
void behind_order(node
*T)//后序遍历 |
57 |
behind_order(T->lchild); |
58 |
behind_order(T->rchild); |
59 |
printf("%c
",T->data); |
66 |
printf("请按先序序列输入一串字符,当子树为空时,输入.\n"); |
68 |
printf("建树成功,T指向二叉树的根!\n"); |
70 |
printf("\n前序遍历二叉树的结果:"); |
73 |
printf("\n中序遍历二叉树的结果:"); |
76 |
printf("\n后序遍历二叉树的结果:"); |
77 |
behind_order(T);printf("\n"); |
- Wireshark分析非标准端口号流量
Wireshark分析非标准端口号流量 2.2.2 分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...
- 非变动性算法源代码分析与使用示例( 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 ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- 二叉树遍历,递归,栈,Morris
一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 | 分类:数据结构 | 标 ...
- Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- 8、SpringMVC源码分析(3):分析ModelAndView的形成过程
首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...
- 《Spark Python API 官方文档中文版》 之 pyspark.sql (三)
摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...
- BZOJ 4551 [Tjoi2016&Heoi2016]树 ——并查集
树剖显然可以做. 然而有一种更神奇的方法,并查集+时光倒流. 每个节点指向它上面最近的标记节点,标记节点指向自己,然后删除标记,就可以用并查集查询了. #include <map> #in ...
- BZOJ2938 [Poi2000]病毒 【AC自动机】
题目 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否存在 ...
- linux信号-------初涉
一.信号的本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程 ...
- FZU 2122 又见LKity【字符串/正难则反/KMP/把一个字符串中某个部分替换为另一个部分】
嗨!大家好,在TempleRun中大家都认识我了吧.我是又笨又穷的猫猫LKity.很高兴这次又与各位FZU的ACMer见面了.最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压 ...
- SPOJ 1825 Free tour II (树的点分治)
题目链接 Free tour II 题意:有$N$个顶点的树,节点间有权值, 节点分为黑点和白点. 找一条最长路径使得 路径上黑点数量不超过K个 这是树的点分治比较基本的题,涉及树上启发式合并……仰望 ...
- Codeforces 691E Xor-sequences
矩阵快速幂.递推式:dp[k][i]=sum(dp[k-1][j]*f[i][j]),dp[k][i]表示的意义是序列中有k个元素,最后一个元素是i的方案数,f[i][j]=1表示i与j能放在一起,反 ...
- T2821 天使之城 codevs
http://codevs.cn/problem/2821/ 题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道, ...
- 12.Java web--过滤器与监听器
1)过滤器 就是为请求与目标之间加一个或多个过滤器 自定义过滤器要实现Filter接口 下面是定义一个所有Servlet的请求中文不乱码 /** * 用于servlet输出中文乱码的过滤 */ @We ...
- 【mac IntelliJ Idea】mac上 idea快速重写父类方法 快捷键
windows上快捷键: Ctrl+O Mac上快捷键: command+O 在要重写父类方法的位置 ,按下快捷键,然后选择要重写的方法即可.