中序和后序便利二叉树(非递归)

如果没有用递归的话,就要用栈保存之前的节点

中序遍历二叉树:首先要先便利左子树,然后就可以输出原节点了,然后在遍历右子树,如果某节点的右子树遍历完了或者右子树为空了,说明以这个节点为根的二叉树遍历完了,此时从栈中退出上一个节点并访问它,再向他的右子树遍历下去

后序遍历二叉树:在算法中,先用栈暂存根节点,再向左子树遍历下去,此时根节点的标记为L,当访问完左子树中的节点并从左子树中退回时,还要去遍历根的右子树,此时根节点的标记为r,在从右子树退出时才能访问位于栈顶的根节点的值

void InOrder(Tree *root) {//利用栈中序遍历非递归算法
	stack<Tree *> s;//
	Tree *temp = root;

	do{
		while(temp!= NULL) {//遍历左子树
			s.push(temp);
			temp = temp->left;
		}
		
		if(!s.empty()) {//避免传入的是空树,遍历右子树
			temp = s.top();
			printf("%c", temp->data);
			s.pop();
			temp = temp->right;	
		}jjjjjjjjjjjjjjjjj
	}while(temp != NULL || !s.empty());//直到没有节点了和栈为空
}

void PostOrder(Tree *root) {//利用栈后序遍历非递归算法
	Tree *temp = root;
	sktNode *w;
	stack<sktNode *>s;
	do {
		while(temp != NULL) {//遍历左子树,并将其标志为L,为后面确保是否都遍历过了该节点以下的节点做了标志
			w->ptr = temp;
			w->tag = 'L';
			s.push(w);
			temp = temp->left;
		}
		int con = 1;
		while(con && !s.empty()) {//设置con为标记是为了标记是否还存在没有遍历完的点
			w = s.top();
			s.pop();
			temp = w->ptr;
			switch(w->tag) {
				case 'L':w->tag = 'R';s.push(w);//将其转化为R,并遍历它的右节点,表示该节点的左节点已经遍历过了,如果右节点便利完了就可一输出了
						temp = temp->right; 
						con = 0;
						break;
				case 'R':printf("%c",temp->data);	 
			
			}	
		}
	}while(!s.empty());
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值