后序遍历(非递归)☆

试写出非递归的后序遍历算法
    分析:
        非递归的后续遍历较中序和先序而言,稍微复杂一点,首先我们需要一直从根节点往下寻找左孩子并入栈,之后访问栈顶元素,
        并判断是否有右孩子,如果有右孩子入栈,并继续往左孩子找,直到某节点为单节点,出栈并访问。需要注意的是因为有可能一个节点我们
        会访问两次,所以我们设置一个指针r用来表示上一次被访问过得节点,防止又把它的右孩子再次入栈。

struct biTree {//树的结构体
	char data;
	struct biTree *lchild;
	struct biTree *rchild;
};
struct Stack {//栈的结构体
	char* arr;	//内存首地址
	int  len;	//栈的容量
	int top; 	//栈的下标
};
#include <stdio.h>
#include <stdlib.h>
void inOrder(biTree *T, Stack *s) {//中序遍历
	biTree *p = T;
	biTree *r = (struct biTree*)malloc(sizeof(struct biTree));
	bool empty(Stack *);
	bool pushS(Stack *, biTree *);
	biTree *top(Stack *);
	bool pop(Stack *);
	while (p || !empty(s)) {
		if (p) {//一路向左
			pushS(s, p);
			p = p->lchild;
		}
		else {
			p = top(s);
			if (p->rchild&&r!=p) {
				r = p;//记录父节点,之后再次遇到它时,就不在将他的右孩子压入栈
				p = p->rchild;
			}
			else {
				printf("%c ", p->data);//打印栈顶元素
				pop(s);//栈顶元素出栈
				p = NULL;//这里一定要将p设为NULL,因为p的孩子已经遍历过了,不设置为NUll的话,又会将左孩子压入栈
			}
			
		}
	}
}
int main() {
	int count = 0;
	struct biTree *T = (struct biTree *)malloc(sizeof(struct biTree));
	struct Stack *s = (struct Stack*)malloc(sizeof(struct Stack));
	biTree *create(biTree*);
	void nodeNum(biTree *, int *);
	Stack *createStack(int);

	T = create(T);
	nodeNum(T, &count);

	s = createStack(count);//创建二叉树节点个数大小的栈

	inOrder(T, s);
	return 0;
}

有种脾气叫,不放弃。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值