二叉树的先序、中序、后序递归非递归实现

【先序】
递归实现:

void PreOrderTraversal(BinTree BT){
	if(BT){
		cout << BT->Data;
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
	}
}

非递归
①建立一个栈,并把根节点放入栈中
②进入循环,循环条件是栈不为空
1°新建一个节点结构,弹出栈顶拷贝给新节点,并打印
2°把节点的右儿子放入栈中
3°把节点的左儿子放入栈中
4°继续循环
③跳出循环,遍历结束

void PreOrderTraversal(BinTree BT){
	BinTree tmp = BT;
	stack s;
	s.push(tmp);
	while(!s.empty()){
		tmp = s.top(); s.pop();
		if(tmp->right != null)
			s.push(tmp->right);
		if(tmp->left != null)
			s.push(tmp->left);
	}
}

【中序】
递归:

void InOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		cout << BT->Data;
		PreOrderTraversal(BT->Right);
	}
}

非递归:
①建栈
②进入循环,条件是栈不为空或者当前节点不为空
1°如果当前节点不为空,则把当前节点压入栈,并更新当前节点为其左儿子
2°否则从栈中弹出一个并打印,更新当前节点为弹出节点的右儿子
3°循环1°2°
③退出循环结束

void InOrderTraversal(BinTree head){
	if(head != null){
		stack s;
		while(!s.empty() || head != null){
			if(head != null){
				s.push(head);
				head = head->left;
			}
			else{
				head = s.top(); s.pop();
				cout << head->Data;
				head = head->right;//有可能没有右儿子,那head = null;
			}
		}
	}
}

【后序】
递归:

void PostOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
		cout << BT->Data;
	}
}

非递归:
后序—》左右中
先序—》中左右—》(很容易得到)中右左,而中右左就是后序的逆,把中右左放到栈中,在打印就是左右中,即后序遍历;
①建立俩个栈,一个正常栈s,一个辅助栈help
②把根节点压入栈
③进入循环,循环条件是栈s不为空
1°从s中弹出放到help栈中,
2°把当前节点的左儿子放入栈s
3°右儿子放入栈s
④循环结束后,弹出help栈中所有元素

void PreOrderTraversal(BinTree BT){
	BinTree tmp = BT;
	stack s, help;
	s.push(tmp);
	while(!s.empty()){
		help.push(s.top()); s.pop();
		if(tmp->left != null)
			s.push(tmp->left);
		if(tmp->right != null)
			s.push(tmp->right);
	}
	while(!help.empty()){
		cout << help.top().data;
		help.pop();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值