用户头像

修心-YC

这梦想,不止不休!

二叉树后序遍历 递归 非递归

后序遍历的操作如下:
1)后序遍历左子树;
2)后序遍历右子树;
3)访问根节点;


对应的递归算法如下:

void PostOrder(Bitree T) {
	if (T != NULL) {
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		visit(T);
     }
}

非递归算法算法思想:当用堆栈来存储结点时,必须分清返回根结点时是从左子树返回的
还是从右子树返回的。所以,使用辅助指针r,指向其最近访问过的结点。也可在结点
增加一个标志域,记录是否已被访问。
对应的非递归算法如下:

void PostOrder(Bitree T) {
	InitStack(S);
	p = T;
	r = NULL;
	while (p || !IsEmpty(S)) {
		if (p) {
			push(S, p);
			p = p->lchild;
		}
		else {
			Get(S, p);
			if (p->rchild&&p->rchild != r) {
				p = p->rchild;
				push(S, p);
				p = p->lchild;
			}
			else {
				pop(S, p);
				visit(p->data);
				r = p;
				p = NULL;
			}
		}
	}
}
posted @ 2019-10-31 22:27  修心-YC  阅读(232)  评论(0编辑  收藏  举报