二叉树,非递归实现(前序、中序、后序)
一、结合栈的方式实现,先让右孩子入栈,在让左孩子入栈。栈为空后,结束遍历。
头文件.根据具体的函数名自己创建,另外需要使用栈,引用栈的头文件
stack.h
1、前需遍历:
法1:
法2:
2、中序遍历:找当前树最左边的节点,并保存所经路径中的所有节点
3、后序遍历:
根据前序、中序;后序、中序可以还原二叉树;但是通过前序、后序不能还原二叉树。
通过前序和中序还原二叉树,程序实现:
a、前序、后序、中序--->递归和非递归速度的比较:循环没有空间开辟、给定是静态栈时,效率比较高,涉及扩容,则效率比较低。
我是借助stack实现的非递归,但是stack可分为静态栈和动态栈,动态栈需要扩容时需要(开辟新空间(新空间需要在系统中查找哪一块空间合适,找到了则返回,查找的过程也浪费时间)、搬移元素、释放旧空间);而递归中开辟新空间只需要执行几个指令,很快。
b、递归和循环遍历的时间复杂度和空间复杂度:
时间复杂度:递归的时间时间复杂度:递归的总次数(2n)*每次递归的次数=O(n)
时间复杂度:用了一个栈,时间复杂度变高O(n)
递归容易在成栈溢出
那么可以不使用栈,用循环的方式遍历二叉树么?线索化二叉树
二、二叉树的线索化(二叉树中总共右n个节点,那么有几个空的指针域:n+1;总共有2*n个指针域,有n-1个指针域已经用过了。【通过指针域的指向,使用循环的方式实现遍历,而不是使用递归的方式】
浙公网安备 33010602011771号