想总结一点树的模板
首先是二叉树的节点定义
typedef struct node {
int data;
struct *lchild, *rchild;
}*Btree, btree;
前序遍历
递归算法
void PREORDER(Btree T) {
if(T) {
visit(T);
PREORDER(T->lchild);
PREORDER(T->rchild);
}
}
迭代算法一
// 前序遍历 --- 非递归算法一
void PREORDER(Btree T) {
Btree Stack[N], p = T;
int top = -1;
if(T) {
Stack[++top] = p;
do {
p = Stack[top--];
visit(p);
if(p->rchild) //先将右子树入栈
Stack[++top] = p->lchild;
if(p->lchild) //再将左子树入栈
Stack[++top] = p->rchild;
}while(top != -1);
}
}
迭代算法二
根据邓俊辉老师的思想写的
// 前序遍历 --- 非递归算法二 (左侧链)
//第一步:自上而下访问左侧链
void visit_left_branch(Btree T, Btree Stack[], int *top) {
while(T) {
visit(T);
Stack[++*top] = T->rchild; //直接将节点推入,空节点也无所谓
T = T->lchild;
}
}
//第二步:自下而上访问右子树
void PREORDER(Btree T) {
Btree Stack[N], p = T;
int top = -1;
while(1) {
visit_left_branch(T, Stack, &top);
if(top == -1) break;
T = Stack[top--];
}
}
中序遍历
递归算法
//中序遍历 ---递归算法 inorder
void INORDER(BTree T) {
if(T) {
INORDER(T->lchild);
visit(T);
INORDER(T->rchild);
}
}
迭代算法一
//中序遍历 ---非递归算法一
#define N 100
void INORDER(Btree T) {
//T为二叉树根节点所在地址
Btree STACK[N], p = T; // 设置一个栈来保存节点
int top = -1;
if(T) {
do {
while(p) {
STACK[++top] = p;
p = p->lchild;
}
p = STACK[top--];
visit(p);
p = p->rchild;
} while(p != NULL || top != -1));
}
}
迭代算法二
根据邓俊辉老师的MOOC写的
//非递归算法二
/*
第一步:访问左侧链的末端
第二步:访问右子树
第三步:控制权回到上层节点
循环
*/
void go_along_left_branch(Btree T, Btree Stack[], int *top) {
while(T) {
Stack[++*top] = T;
T = T->lchild;
}
}
void inorder(Btree T) {
Btree Stack[N];
int top = -1;
while(1) {
go_along_left_branch(T, Stack, &top);
if(top == -1) break;
T = Stack[top--];
visit(T);
T = T->rchild;
}
}
后序遍历
递归算法
void POSTORDER(Btree T) {
if(T) {
POSTORDER(T->lchild);
POSTORDER(T->rchild);
visit(T);
}
}
迭代算法
//后续遍历 --- 非递归算法
void POSTORDER(Btree T) {
Btree Stack1[N], p = T; // 设置一个栈保存节点
int Stack2[N], top = -1, flag; // 设置栈和flag用来区分是否读取
if(T) {
do {
while(p) {
Stack1[++top] = p;
Stack2[top] = 0;
p = p->lchild;
}
p = Stack1[top];
flag = Stack2[top--];
if(flag == 0) {
Stack1[++top] = p;
Stack2[top] = 1;
p = p->rchild;
}
else {
visit(p);
p = NULL;
}
}while(p || top != -1);
}
}
层次遍历
//层次遍历
void LAYEORDER(Btree T) {
Btree Queue[N], p = T;
int front, rear;
if(T) {
Queue[0] = T;
front = -1;
rear = 0;
while(front < rear) {
p = Queue[++front];
visit(p);
if(p->lchild) Queue[++rear] = p->lchild;
if(p->rchild) Queue[++rear] = p->rchild;
}
}
}
重构
要完成重构二叉树,必须==[先序 | 后序] + 中序==
只有先序和后序,不一定能够还原二叉树,除非这个二叉树是一个真二叉树(每个节点的度都为偶数)