引文
大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的。线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
前置
构建线索二叉树结构体,这里我为了方便,将普通二叉树结构体和线索二叉树结构体混杂在一起,只是名字变了,方便共同使用栈或者是队列的代码。
还需要构建栈,不懂栈的朋友们请百度。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef int ElemType;
//链式存储二叉树
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,* rchild;
int ltag,rtag;
} BiTNode,*BiTree,ThreadNode,*ThreadTree;
//------------------栈开始------------
//是用顺序栈
typedef struct{
BiTree data[MaxSize];
int top;
} SqStack;
//初始化
void initSqStack(SqStack &Stack){
Stack.top = -1;
}
bool isEmpty(SqStack &Stack){
return Stack.top==-1;
}
//入栈
bool push(SqStack &Stack,BiTree& T){
if(Stack.top==MaxSize-1){
return false;
}
Stack.data[++Stack.top] = T;
return true;
}
//出栈
bool pop(SqStack &Stack,BiTree& T){
if(Stack.top==-1){
return false;
}
T = Stack.data[Stack.top--];
return true;
}
//获取栈顶元素
bool getStackTop(SqStack &Stack,BiTree &T){
if(Stack.top==-1){
return false;
}
T = Stack.data[Stack.top];
return true;
}
//---------------栈结束---------------
//给一个二叉树以层序遍历的方式插入结点
void addNode(BiTree &T,ElemType value){
BiTree innerTree = NULL;
BiTNode *node = (BiTNode *) malloc(sizeof(BiTNode));
node->data = value;
node->lchild = NULL