二叉树的非递归遍历

二叉树,就是每个节点最多只有两个子节点类树结构(应该二叉树可以为空,但是树的定义要求树不为空,所以我称他为类树结构)。

二叉树的非递归遍历的泛华代码与解释如下:

首先定义二叉树的二叉链结构

template<typename NT>
struct BTnood{
    NT data;
    BTnood* lc;
    BTnood* rc;
    BTnood(NT const& v=NT(),BTnood* lc_=0,BTnood* rc_=0):data(v),lc(lc_),rc(rc_){}
    bool haslc(){return !lc==0;}
    bool hasrc(){return !rc==0;}
};

首先是二叉树的非递归先序遍历:

其实思路就是递归遍历的循环方式实现而已。

首先访问输出根节点,当该节点有右子节点的时候先把其压栈,然后访问左子节点,并把左子节点作为新的根节点,知道最深层的根节点没有子节点为止,然后出栈访问左子节点-》右子节点:

//先序遍历 --- 非递归
template<typename NT>
void preorder(NT* root,void (*Visit)(NT*))
{
	if(root!=0)
	{
		std::stack<NT*> s;
		while(true)
		{
			Visit(root);
			if(root->hasrc()) s.push(root->rc);
			if(root->haslc()) s.push(root->lc());
			else
			{
				if(s.empty()) return;
				root = s.top();s.pop();
			}
		}
	}
}

  

二叉树的非递归中序遍历:

中序遍历的访问顺序是,左子节点->根节点->右子节点

那么就要先找到最深处的左子节点啊,所以在while循环中,将所有左子节点入栈,知道没有左子节点时就可以输出其本身,然后判断是否有右子节点,如果有则入栈,进入下一轮循环以便判断其是否有左子节点需要先与其输出

//中序遍历 非递归
template<typename NT>
void inorder(NT* root,void (*Visit)(NT*))
{
    if(root == 0) return;
    std::stack<NT*> s;
    s.push(root);
    while(true)
    {
        root = s.top();
        while(root->haslc()) s.push(root=root->lc);
        Visit(root);
        if(root->hasrc()) s.push(root->rc);
        else
        {
            do
            {
                Visit(root=s.top());
                s.pop();
            }while(!root->hasrc()||!s.empty());
        }
    }
}
原文地址:https://www.cnblogs.com/imhurley/p/2713734.html