创建先序遍历序列二叉树
测试数据: ABC000DE0F00G00 (这是一个先序序列 ,0表示当前结点为空)
#include<stdio.h>
#include<malloc.h>
typedef struct node {
char data;
struct node *lchild;
struct node *rchild;
} node;
char chin[100];//数组从储存获取的二叉树序列元素
int m;
int initChain(node *&q,int step) {
if(step>=m||chin[step]=='0') {
return step;
}
if(q==NULL) {
q=(node *)malloc(sizeof(node));
q->lchild=NULL;
q->rchild=NULL;
}
q->data=chin[step];
//printf("%c ",q->data);
step=initChain(q->lchild,++step);
step=initChain(q->rchild,++step);
}
int main() {
while(scanf("%s",chin)!=EOF) {
m=0;
while(chin[m]!='\0') {
m+=1;
}
node *q;
q=NULL;
initChain(q,0);
}
}
一、先序遍历:依次访问根节点 、左孩子结点、右孩子结点
算法思想:出栈一个元素,就访问一个元素。
1.先是栈顶结点入栈,然后根节点出栈,(访问当前栈顶元素)
2.如果有右孩子,则右孩子入栈,(因为先访问左孩子,再访问右孩子,则右孩子先入栈)
3.如果左孩子存在,左孩子入栈,然后循环到第1步
//先序遍历
void xianChine(node *q) {
if(q!=NULL) {
node *stack[100]; //定义一个栈
int top=-1;
node *p;
stack[++top]=q; //根节点进栈
while(top!=-1) {
p=stack[top--]; //栈顶结点出栈
printf("%c ",p->data);
if(p->rchild!=NULL) {
stack[++top]=p->rchild; //入栈当前结点的右孩子结点
}
if(p->lchild!=NULL) {
stack[++top]=p->lchild; //入栈当前结点的左孩子结点
}
}
}
}
二、中序遍历:依次访问左孩子结点、根节点 、右孩子结点
算法思想:出栈一个元素,就访问一个元素。
1.先当前结点、当前结点的左孩子进栈。保证当前结点、及当前结点的左孩子全部进栈了
2.栈不为空时,访问栈顶元素,栈顶元素右孩子结点进栈
3.执行第一步循环(注意结束循环的条件)
//中序遍历
void midChine(node *q) {
if(q!=NULL) {
node *stack[100]; //定义一个栈
int top=-1;
node *p;
p=q; //根节点进栈
while(top!=-1||p!=NULL) {
while(p!=NULL) { //先将当前结点、当前先结点中的左孩子结点进栈
stack[++top]=p;
p=p->lchild;
}
if(top!=-1) { //栈不为空 ,当前结点的右孩子结点进栈
p=stack[top--]; //先出栈当前结点
printf("%c ",p->data);
p=p->rchild;
}
}
}
}
三、后序遍历:依次访问左孩子结点、右孩子结点、根节点 、
算法思想:
先序遍历序列:1、2、3、5、4
后序遍历序列:3、5、2、4、1
后序遍历序列逆序:1、4、2、5、3
逆后序遍历序列是先序遍历过程中对左右子树遍历顺序交换所得结果。
我们只需要将得到的逆后序遍历结果逆序输出即可
//后序遍历
void lastChine(node *q) {
if(q!=NULL) {
node *stack1[100]; //定义第一个栈
node *stack2[100]; //定义第二个栈
int top=-1;
int top2=-1;
node *p;
stack1[++top]=q;
while(top!=-1) {
p=stack1[top--]; //出栈根结点
stack2[++top2]=p;
if(p->lchild!=NULL) {
stack1[++top]=p->lchild; //先进栈左孩子结点
}
if(p->rchild!=NULL) {
stack1[++top]=p->rchild; //再入栈右孩子结点
}
}
while(top2!=-1) {
p=stack2[top2--];
printf("%c ",p->data);
}
}
}