二叉树的非递归(迭代)统一实现“前中后序遍历”详解

目录


二叉树大家都非常熟悉,二叉树的遍历大家也不会陌生。用递归法来实现二叉树的“前中后序遍历”相对简洁,用几行代码就能实现,并且只需改变代码顺序就能实现3种遍历。与之相反,非递归(迭代)遍历方法实现“前中后序遍历”起来较为复杂,并且不太容易通过简单的交换代码的次序来实现3种遍历,当然,只是不太容易,并不是没有方法。 下面就介绍统一的非递归(迭代)方法来是实现“前中后序遍历”。

这个过程要使用栈的数据结构,这点想来不用多解释。

树节点的定义如下:

template<class T>
class TreeNode
{
   
public:
	T data;
	TreeNode* leftChild;
	TreeNode* rightChild;
};

首先明确一点:树中的任何一个节点都可以是父节点。每个父节点总是有左右两个子节点(空的子节点暂时也算是一个节点)。做遍历时,按照遍历的方式,依次把父节点和左右两个子节点压入栈中。此处以“后序遍历”为例,那么入栈的顺序就是父节点、右节点、左节点,按照思路,可以写出如下代码:

void BinaryTree<T>::PostOrderIterate(TreeNode<T> * node)
{
   
	std::stack<TreeNode<T> *> st;//定义一个栈

	TreeNode<T> * curnode = node;
	if (curnode == nullptr) return;
	//将父节点和两个子节点压入栈中,若子节点没有,不用压入栈
	st.push(curnode);
	if (curnode->rightChild) st.push(curnode->rightChild);
	if (curnode->leftChild) st.push(curnode->leftChild);

	while (!st.empty()){
   
	    //每次top出的栈顶数据可能是父节点或子节点。但是,不管哪种节点,现在都作为一个父节点,那么其入栈顺序要变,所以pop掉,重新入栈
		curnode = st.top();
		st.pop();
		//按遍历顺寻入栈
		st.push(curnode);
		if (curnode->rightChild) st.push(curnode->rightChild);
		if (curnode->leftChild) st.push(curnode
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值