二叉树的三种非递归遍历

 递归法:
 先序法: 根 左 右
//void preOrder(lptree root){
//	if(root!=NULL){
//		printCurNodeData(root);	// 根
//		preOrder(root->LChild);	// 左
//		preOrder(root->RChild); // 右
//	}
//}
 中序法: 左 根 右
//void midOrder(lptree root){
//	if(root!=NULL){
//		midOrder(root->LChild); // 左
//		printCurNodeData(root); // 根
//		midOrder(root->RChild); // 右
//	}
//}
 后序法: 左 右 根
//void lastOrder(lptree root){
//	if(root!=NULL){
//		lastOrder(root->LChild); // 左
//		lastOrder(root->RChild); // 右
//		printCurNodeData(root);  // 根
//	}
//}

// 非递归法
// 将走过的路径 入栈
// 到叶子结点的时候开始 出栈
// 然后找右子树是否为NULL
void preOderBystack(lptree root) {
	if (root == NULL) return;
	//准备栈
	lptree stack[10];	// 存储每次打印节点的位置(指针)
	int stacktop = -1 ; // 栈顶标记

	lptree pmove = root; // 从根节点开始打印
	while (stacktop != -1 || pmove) {
		// 根  左 右
		while (pmove) {
			pmove = root->LChild;
			//路径入栈 + 打印走过的节点
			stack[++stacktop] = pmove;
			printf("%c\t", pmove->data);
		}// 找到最左边的节点后 无路可走
		if (stacktop != -1) { //栈不为空
			pmove = stack[stacktop]; // 获取栈顶元素
			stacktop--; // 出栈
			pmove->RChild; // 右边节点
		}
	}
}

void midOderByStack(lptree root) {
	if (root == NULL) return ;
	//  准备栈
	lptree stack[10];
	int stacktop = -1;
	//  定义移动指针
	lptree pmove = root;
	while (stacktop != -1 || pmove) {
		// 走到最左边,将走过的结点入栈
		while (pmove) {
			stack[++stacktop] = pmove;
			pmove = root->LChild;
		}
		if (stacktop != -1) {
			pmove = stack[stacktop];
			stacktop--;
			printf(("%c\t"),pmove->data);
			pmove = root->RChild;
		}
	}
}

void lastOderByStack(lptree root){
	if(root == NULL)  return;
	
	lptree stack[10];
	int stacktop = -1;
	
	lptree pmove = root;
	while(stacktop!=-1 || pmove){
		while(pmove){
			stack[++stacktop] = pmove;
			pmove = root ->LChild;
		}
		if(stacktop!=-1){
			pmove = stack[stacktop--];
			printf("%c\t",pmove->data);
			pmove = root->RChild;
		}
	}
}

void lastOrderByStack(lptree root){
	if(root == NULL) return ;
	
	lptree stack[10];
	int stacktop=-1;
	
	lptree pmove = root; // 移动指针
	lptree plastvisit = NULL; //访问标记
	
	// 左 右 根
	while(pmove){
		stack[++stacktop] = pmove;
		pmove = pmove->LChild;
	}
	while(stacktop!=-1){
		pmove = stack[stacktop--];
		// 当前节点左右是否被访问
		if(pmove->RChild==NULL || pmove->RChild==plastvisit){
			printf("%c\t",pmove->data);
			plastvisit = pmove; // 改变标记位置
		}
		else{
			// 右边没有被访问
			stack[++stacktop] = pmove;
			pmove = pmove->RChild;
			while(pmove){
				stack[++stacktop] = pmove;
				pmove = pmove -> LChild;
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值