【二叉树】建树以及先中后序递归与非递归遍历
注意点
采用先序建树
非递归用到栈的知识
递归实现三种遍历
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int level = 1;
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T){
char ch;
scanf("%c", &ch);
if (ch == '#') T = NULL;
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrderTraverse(BiTree t, int level){
if (t == NULL) return;
printf("data=%c, level=%d\n", t->data, level);
PreOrderTraverse(t->lchild, level+1);
PreOrderTraverse(t->rchild, level+1);
}
void InOrderTraverse(BiTree t, int level){
if (t == NULL) return;
InOrderTraverse(t->lchild, level+1);
printf("data=%c, level=%d\n", t->data, level);
InOrderTraverse(t->rchild, level+1);
}
void PostOrderTraverse(BiTree t, int level){
if (t == NULL) return;
PostOrderTraverse(t->lchild, level+1);
PostOrderTraverse(t->rchild, level+1);
printf("data=%c, level=%d\n", t->data, level);
}
int main(){
BiTree t = NULL;
printf("以先序遍历方式输入二叉树\n");
printf("注意'#'用于表示空结点\n");
CreateBiTree(t);
printf("-----前序遍历二叉树-----\n");
PreOrderTraverse(t, level);
printf("-----中序遍历二叉树-----\n");
InOrderTraverse(t, level);
printf("-----后序遍历二叉树-----\n");
PostOrderTraverse(t, level);
return 0;
}
非递归实现三种遍历
#include <iostream>
#include <cstdio>
using namespace std;
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}BiTNode, *BiTree;
typedef int status;
typedef BiTree SElemType;
typedef struct{
SElemType * base;
SElemType * top;
int stacksize;
}SqStack;
status InitStack(SqStack &s){
s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}
status GetTop(SqStack s, SElemType &e){
if (s.top == s.base) return ERROR;
e = * (s.top - 1);
return OK;
}
status Push(SqStack &s, SElemType e){
if (s.top - s.base >= s.stacksize){
s.base = (SElemType *)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(SElemType));
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
* s.top++ = e;
return OK;
}
status Pop(SqStack &s, SElemType &e){
if (s.top == s.base) return ERROR;
e = * --s.top;
return OK;
}
status StackEmpty(SqStack s){
if (s.top != s.base) return ERROR;
return OK;
}
void CreateBiTree(BiTree &T){
char ch;
scanf("%c", &ch);
if (ch == '*') T = NULL;
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void Non_Recursive_PreOrderTraverse(BiTree t){
SqStack s;
InitStack(s);
BiTree p = t;
while (!StackEmpty(s) || p){
if (p){
Push(s, p);
printf("%c", p->data);
p = p->lchild;
}
else {
Pop(s, p);
p = p->rchild;
}
}
}
void Non_Recursive_InOrderTraverse(BiTree t){
SqStack s;
InitStack(s);
BiTree p = t;
while (!StackEmpty(s) || p){
if (p){
Push(s, p);
p = p->lchild;
}
else {
Pop(s, p);
printf("%c", p->data);
p = p->rchild;
}
}
}
void Non_Recursive_PostOrderTraverse(BiTree t){
SqStack s;
InitStack(s);
BiTree p = t, cur = NULL;
Push(s, p);
while (!StackEmpty(s)){
GetTop(s, p);
if ((p->lchild == NULL && p->rchild == NULL)
|| (cur == p->lchild || cur == p->rchild)){
printf("%c", p->data);
Pop(s, p);
cur = p;
}
else {
if (p->rchild != NULL) Push(s, p->rchild);
if (p->lchild != NULL) Push(s, p->lchild);
}
}
}
int main(){
BiTree t;
printf("以先序遍历方式输入二叉树\n");
printf("注意'*'用于表示空结点\n");
CreateBiTree(t);
printf("-----先序非递归遍历-----\n");
Non_Recursive_PreOrderTraverse(t);
printf("\n-----中序非递归遍历-----\n");
Non_Recursive_InOrderTraverse(t);
printf("\n-----后序非递归遍历-----\n");
Non_Recursive_PostOrderTraverse(t);
printf("\n");
return 0;
}
相关资料
https://www.cnblogs.com/lanhaicode/p/10358736.html
https://www.cnblogs.com/lanhaicode/p/10390147.html
https://blog.csdn.net/dream0130__/article/details/80779486
https://www.cnblogs.com/masker99/articles/10703257.html
https://blog.csdn.net/zhangxiangDavaid/article/details/37115355
https://blog.csdn.net/lihongzhihhh/article/details/80034254
https://blog.csdn.net/czy47/article/details/81254984