二叉树的遍历

Posted vlyf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历相关的知识,希望对你有一定的参考价值。

递归遍历

前序

//前序遍历
void PreOrder(BTnode *pnode)
{
    if (pnode)
    {
        visit(pnode);
        PreOrder(bnode->left);
        PreOrder(bnode->right);
    }
}

中序

//中序遍历
void InOrder(BTnode *pnode)
{
    if (pnode)
    {
        InOrder(pnode->left);
      递归遍历  visit(pnode);
        InOrder(pnode->right);
    }
}

后序

//后序遍历
void PostOrder(BTnode *pnode)
{
    if (pnode)
    {
        PostOrder(pnode->left);
        PostOrder(pnode->right);
        visit(pnode);
    }
}

非递归遍历

前序

? 先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。

//前序遍历
void PreOrder1(BTnode *pnode)
{
    stack<*BTnode> s;
    BTnode *p = pnode;
    while (p || !s.empty())
    {
        while (p)
        {
            visit(p); //先访问根节点,再入栈
            s.push(p);
            p = p->left; //遍历到左子树最下面
        }
        if (!s.empty())
        {
            p = s.top();
            s.pop();
            p = p->right; //进入右子树,开始新的遍历
        }
    }
}
void PreOrder2(BTnode *pnode)
{
    stack<*BTnode> s;
    BTnode *p = pnode;
    while (p || !s.empty())
    {
        if (p)
        {
            visit(p);
            s.push(p);
            p = p->left;
        }
        else
        {
            p = s.top();
            s.pop();
            p = p->right;
        }
    }
}
void PreOrder3(BTnode *pnode)
{
    stack < *BTnod入栈
                BTnode *p = pnode;
    while (p || !s.empty())
    {
        visit(p);
        if (p->right)
            s.push(p->right);
        if (p->left)
            s.push(p->left);
        else
        {
            p = s.top();
            s.pop();
            p = p->right; //左子树访问完了,访问右子树
        }
    }
}

中序

//中序遍历
void InOrder1(BTnode *pnode)
{
    stack<*Bnode> s;
    BTnode *p = pnode;
    while (p || !s.empty())
    {
        //先找到左子树的最下边的节点
        while (!p)
        {
            s.push(p); //边遍历边保存根节点到栈中
            p = p->left;
        }
        //p为空时,说明已经到达左子树最下边,这时需要出栈
        if (!s.empty())
        {
            p = s.top();
            visit(p);
            s.pop();
            p = p->right; //进入右子树,开始新的一轮左子树遍历
        }
    }
}
vodi InOrder2(BTnode *pnode)
{
    stack<*BTnode> s;
    BTnode *p = pnode;
    while (p || !s.empty())
    {
        if (p)
        {
            s.push(p);
            p = p->left;
        }
        else
        {
            p = s.top();
            s.pop();
            visit(p);
            p = p->right;
        }
    }
}

后序

以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历

讲透学烂二叉树:二叉树的遍历图解算法步骤及JS代码

二叉树(2.二叉树的遍历和实现)

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

代码题— 二叉树的层次遍历