非递归算法
中序遍历(利用栈)
基本思想:
- 建立一个栈
- 根结点进栈,遍历左子树
- 根结点出栈,输出根结点,遍历右子树
这里用到栈的代码了,又翻开了以前整理的链栈的操作,发现了这种代码可移植性的好处,在之前操作链栈定义的数据类型为int,typedef int SElemType;现在我们要操作的对象不是整数类型,而是二叉树的指针类型,所以我们将SElemType重新定义别名为:typedef BiTree SElemType;拿过来就可以使用了(-△-)。
完整代码
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char TElemType;
typedef struct BiNode {
TElemType data;
struct BiNode* lchild, * rchild;//左右孩子指针
}BiTNode,*BiTree;
Status CreateBiTree(BiTree& T);
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树
//构造二叉链表表示的二叉树T
Status CreateBiTree(BiTree& T)
{
char ch;
scanf("%c",&ch);
if (ch == '@')
T = NULL;
else
{
T = ((BiTNode*)malloc(sizeof(BiTNode)));
if (!(T = (BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return OK;
}//CreateBiTree
typedef BiTree SElemType;
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
Status InitStack(LinkStack& S)
{
//构造一个空栈,栈顶指针置为空
S = NULL;
return OK;
}//InitStack
Status StackEmpty(LinkStack S)
{
if (S ==