先说说我实现二叉树的方法,才能开始讲述我被指针搞得晕头晕脑的痛苦经历。
/****************二叉树非递归的总体分析*****************/
(1)建立二叉树
栈的应用:用空格键表示空指针,我们利用栈来保存左右孩子指针未都被赋值的节点,空指针不允许入栈
开始建立:以循环遍历用户输入的字符串来建立二叉树,如:"AB#D##CE###"(这里先用#代替空格,方便查看)
我们以先序建立二叉树,按上面例子中的字符串建立的二叉树如下:
(visio不怎么会用,这图看着。。。忍耐一下)
从图中可以清晰的发现一个规律:
字符串中,任意一个字符的前一个(即i-1)字符若不为空格的话,这个字符一定是前一个非空格字符的左子树
在由先序这个条件还可以发现,我们始终是从左向右建立子树的,所以,如果第i-1个字符为空格,第i个字符就
一定是前一个刚建立的子树的右子树
(2)遍历二叉树
栈的应用:我们从二叉树顶端开始走的时候,将未遍历的节点的数据入栈,遍历一个节点从栈中弹一个出来
中序遍历:我们采用中序遍历二叉树,在非递归算法中,根据中序的定义,我们也需要让第一个取得的头节点A
从右开始向下走,一直往右边走(途中遇到的节点依次入栈),直到走到第一个左子树为空的节点,这里显然是B,
然后访问B,然后B退栈,若B右指针非空,则遍历往右走一步(为空的时候下面讨论),然后B的右子树入栈,
继续循环以B的右子树为头节点走到最左端,直到把节点都走完,这里走到D 的时候就已经结束了,直接访问D&#