想到一个简单的后序遍历二叉树的算法

只用一个栈,每个节点入栈出栈各一次(代码可以直接运行)

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值