后序非递归

本文介绍了一种使用栈实现的二叉树后序遍历非递归算法,并给出了完整的C语言代码示例。通过巧妙地利用栈来跟踪节点,实现了不使用递归方式遍历二叉树的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 *				Date: 2013/3/11
 *				PostOrder Iteration Method
 *												NolanJian 
 */ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct treenode;
struct node;
typedef struct treenode TreeNode;
typedef TreeNode *TreePointer;
typedef struct node Node;
typedef Node *NodePointer;

void Push(TreePointer Tp, NodePointer *top);
void Pop(NodePointer * top);
void PostOrder(TreePointer H);
TreePointer Create(char* preorder, char* inorder, int n);

struct treenode {
	char data;
	TreePointer LeftChild, RightChild;
};
struct node {
	TreePointer Tp;
	NodePointer Next;
};

int main() {
	TreePointer root;
	char pre[] = "ABCDEFGHIJKLMNOP";
	char in[]  = "DCEFBGHAJILKNOMP";
	root = Create(pre, in, strlen(pre));
	PostOrder(root);
	return 0;
}
//这次编程的目的:PostOrder非递归实现 
void PostOrder(TreePointer H) {
	TreePointer p = H, q;			//H是树根节点指针, p是操作指针, q是标记指针 
	NodePointer Top = NULL;			//Top是栈顶指针,这次的栈是用链表实现的 
	int flag;						//flag的作用的出栈许可, 0不可, 1允许	
	do {
		while(p) {					//左子树总是不断入栈的 
			Push(p, &Top);			//Push是入栈函数 
			p = p->LeftChild;
		}
		q = NULL;					//标记指针q的复位处,不能总指着一个地方,
									//而且q指向的地方有可能是左子树
									//就算q指向右子树,也有可能为NULL 
		flag = 1;					//当左子树已经最大限度入栈后,允许有出栈操作 
		while(Top && flag) {		//如果栈是非空的和允许出栈 
			p = Top->Tp;			//获得栈顶元素 
			if(p->RightChild == q) {//如果栈顶元素的右子树已经访问过,即等于标记q 
				Pop(&Top);			//则出栈 
				q = p;				//并标记p指向的地方已经访问过 
			}
			else {					//如果栈顶元素的右子树没有访问过,即不等于标记q 
				p = p->RightChild;
				flag = 0;			//既然右子树还没访问,则肯定不允许有出栈操作 
			}
		}
	}while(Top);					//结束条件是空栈 
}

void Push(TreePointer Tp, NodePointer *top) {
	NodePointer tmp = (NodePointer)malloc(sizeof(Node));
	tmp->Next = NULL;
	tmp->Tp = Tp;
	if(*top == NULL) 
		*top = tmp;
	else {
		tmp->Next = (*top);
		*top = tmp;
	}
}

void Pop(NodePointer * top) {
	printf("%c", (*top)->Tp->data);
	*top = (*top)->Next;
}

TreePointer Create(char* preorder, char* inorder, int n) {
	char* p, *q;
	int i, j, m;
	TreePointer root;
	if(n <= 0)
		return NULL;
	root = (TreePointer)malloc(sizeof(TreeNode));
	root->data = preorder[0];
	root->LeftChild = root->RightChild = NULL;
	i = 0;
	while(i < n) {
		if(preorder[0] == inorder[i])
			break;
		i++;
	}
	p = preorder + 1;
	q = inorder;
	root->LeftChild = Create(p, q, i);
	p = preorder + i + 1;
	q = inorder + i + 1;
	root->RightChild = Create(p, q, n - i - 1);
	return root;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值