二叉树遍历的非递归算法

二叉树遍历的非递归算法

二叉树遍历的非递归算法需要额外的数据结构支持,以栈为例

stack<BiTree *> st = stack<BiTree *>();

第一种类型

先序遍历

if (root)
    st.push(root);
while (!st.empty()){
	root = st.top();
    visit(root->val);
    st.pop();
    if (root->right)
        st.push(root->right);
    if (root->left)
        st.push(root->left);
}

中序遍历

st.push(root);
while (!st.empty()){
    while (st.top())        // go left until end
        st.push(st.top()->left);
    st.pop();   			//  pop nullptr
    if (!st.empty())
    {
        root = st.top();
        st.pop();
        visit(root->val);
        st.push(root->right);
    }
}
  • 一种等价的形式如下(截图自邓俊辉-数据结构(上)-学堂在线)
x = root;
while(true)
{
	while(x)			// walk along left branch
	{
		st.push(x);
		x = x->left;
	}

	if(st.empty())		// 中止条件:栈空
		break;
	
	x = st.top();		// x 的左子树或空或已遍历
	st.pop();			// 将 x 出栈并访问之
	visit(x->val);
	
	x = x->right;		// 再转向右子树
}

后序遍历

后序遍历需要一个额外的指针提供信息

BiTree* pre = nullptr;
st.push(root);
while(!st.empty())
{
    root = st.top();
    if(root->left && root->left != pre && root->right != pre)
        st.push(root->left);
    else if(root->right == nullptr || root->right == pre)
    {
        pre = root;
        visit(root->val);
        st.pop();
    }
    else
        st.push(root->right);
}

第二种类型

先序遍历

while (root || !st.empty())
{
    if (root)
    {
        visit(root->val);
        if (root->right)
            st.push(root->right);
        root = root->left;
    }
    else
    {
        root = st.top();
        st.pop();
    }
}
  • 一种等价形式如下(截图自邓俊辉-数据结构(上)-学堂在线)
while(true)
{
	x = root;
	while(x)			// 实现 Walk along left branch
	{
		visit(x->val);			// 先序访问
		st.push(x->right);		// 右子树入栈
		x = x->left;			// 沿左侧链下行
	}
	if(st.empty())		// 栈空就终止遍历
		break;
		
	root = st.top();	// 弹出下一子树的根
	st.pop();
}

中序遍历

while (root || !st.empty())
{
    if (root)
    {
        st.push(root);
        root = root->left;
    }
    else
    {
        root = st.top();
        st.pop();
        visit(root->val);
        root = root->right;
    }
}

后序遍历

后序遍历需要一个额外的指针提供信息

BiTree* pre = nullptr;
while (root || !st.empty())
{
    if (root)
    {
        st.push(root);
        root = root->left;
    }
    else
    {
        root = st.top();
        if (root->right == nullptr || root->right == pre)
        {
            visit(root->val);
            pre = root;
            st.pop();
            root = nullptr;
        }
        else
            root = root->right;
    }
}

你可能感兴趣的:(数据结构,二叉树,算法,数据结构)