二叉树前序、中序和后序的非递归遍历

发布时间:2020-06-25 01:49:01 作者:zheng_feng
来源:网络 阅读:275

非递归遍历二叉树利用栈的先进先出特点完成实现

前序比较好理解先压根入栈,在while里面访问根,根出栈,再压入右子树,左子树,这样的遍历二叉树就是前序遍历了。

void PrevOrdr_NonR()

{

    stack<BinaryTreeNode<T>*> s;

    s.push(_root);

    while(!s.empty())

    {

       BinaryTreeNode<T>* top = s.top();

       s.pop();

       cout<<top->_data<<" ";

       if(top->_right)

           s.push(top->_right);

       if(top->_left)

           s.push(top->_left); 

    }

    cout<<endl;

}

中序的遍历顺序是左子树、根节点、右子树。

void InOreder_NonR()

{

    stack<BinaryTreeNode<T>*> s;

    BinaryTreeNode<T>* cur = _root;

    while(cur || !s.empty())

    {

        while(cur)//把左路径的节点全部压入栈

        {

            s.push(cur);

            cur = cur->_left;

        }

        if(!s.empty())

        {

            BinaryTreeNode<T>* top = s.top();

            s.pop();

            cout<<tmp->_data<<" ";

            cur = cur->_right;//把cur指向最后一个左节点的右节点

        }

    }

    cout<<endl;

}

后序遍历是左子树、右子树、根节点。

void PostOrder_NonR()

{

    stack<BinaryTreeNode<T>*> s;

    BinaryTreeNode<T>* cur = _root;

    BinaryTreeNode<T>* prevVisited = NULL;

    while(cur || s.empty())

    {

        while(cur)//左路径的节点入栈

        {

            s.push(cur);

            cur = cur->_left;

        }

        BinaryTreeNode<T>* top = s.top();

        if(top->_right == NULL || top->right == preVisited)

        //当子树遍历之后回退到上一个没有遍历的子树

        {

            cout<<top->_data<<" ";

            preVisited = tmp;

            s.pop();

        }

        else

        {

            cur = cur->left;//把cur指向右子树继续寻找左节点

        }

    }

}

推荐阅读:
  1. 创建、前序、中序、后序递归遍历二叉树
  2. 树:二叉树的前序/中序/后序/层次递归

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

二叉树 递归 遍历

上一篇:Java KeyStore 用命令生成keystore文件

下一篇:获取piwik里存的ip地址。

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》