只用一个栈,每个节点入栈出栈各一次(代码可以直接运行)
#include<stdio.h>
#include<iostream>
#include<malloc.h>
/*
* 构建一个二叉树
*/
typedef struct Bench {
int data;
Bench *r;
Bench *l;
}Bench, *pBench;
Bench Root;// 树根
void initTree();// 以树根开始构建并初始化一颗二叉树
// 构建的二叉树与下图中的不同
/****************************************
以如下视图观察这个树(左节点=左孩子,下节点=右孩子),序号表示后序遍历的顺序:
1--3--7--15
| | |
2 | |
| |
4--6 |
| |
5 |
|
8--10-14
| |
9 |
|
11--13
|
12
观察后序遍历过程我们可以发现,当读到每一个没有下节点的点时,其后要读的点就会一直向上,一直读到顶(不是任何节点的下节点的点)
而观察栈时我们发现,栈中的每一个节点的上一个一定是它的父母;
我们将栈顶节点弹出,如果它是此时栈顶的左节点,则表明它是顶节点
****************************************/
/*
* 栈
*/
pBench Stack[10];
int top = -1;
pBench pop() {
pBench r = NULL;
if (top > -1) {
r = Stack[top];
top--;
}
return r;
}
pBench readTop() {
if (top > -1) {
return Stack[top];
}
else {
return NULL;
}
}
void push(pBench b) {
Stack[++top] = b;
}
bool EmptySatck(){
if (top<0) {
return true;
}else{
return false;
}
}
/****************************************/
/*
* 算法开始
*/
int main() {
initTree(); // 构建树
pBench p = &Root; // 指针值向树根
// 1.将最高层(上图第一行)全部压入
while (p!=NULL) {
push(p);
p = p->l;
}
// 2.开始
while (!EmptySatck()) {// 栈不空
p = readTop(); // GetTop();
if (p->r!=NULL) { // 如果不是该列最底的节点
p = p->r; // 下移
while (p != NULL) { // 将节点及其左边一行的所有节点压入
push(p);
p = p->l;
}
}
else { // 如果是列最底部底的节点(该列可能只有一个),则一直读到顶
do{
p = readTop();// 该语句第一次执行时无意义
printf("%d,",p->data);
p = pop();
}while (readTop() != NULL && readTop()->l != p);// 栈不空 且 不是顶点
}
}
system("pause");
return 0;
}
void initTree() {
pBench B2 = (pBench)malloc(sizeof(Bench));
pBench B3 = (pBench)malloc(sizeof(Bench));
pBench B4 = (pBench)malloc(sizeof(Bench));
pBench B7 = (pBench)malloc(sizeof(Bench));
pBench B8 = (pBench)malloc(sizeof(Bench));
pBench B9 = (pBench)malloc(sizeof(Bench));
pBench B14 = (pBench)malloc(sizeof(Bench));
pBench B18 = (pBench)malloc(sizeof(Bench));
pBench B19 = (pBench)malloc(sizeof(Bench));
B2->data = 2;
B3->data = 3;
B4->data = 4;
B7->data = 7;
B8->data = 8;
B9->data = 9;
B14->data = 14;
B18->data = 18;
B19->data = 19;
B2->l = B4; B2->r = NULL;
B3->l = NULL; B3->r = B7;
B4->l = B8; B4->r = B9;
B7->l = B14; B7->r = NULL;
B8->l = NULL; B8->r = NULL;
B9->l = B18; B9->r = B19;
B14->l = NULL; B14->r = NULL;
B18->l = NULL; B18->r = NULL;
B19->l = NULL; B19->r = NULL;
Root.l = B2; Root.r = B3;
Root.data = 1;
}