二叉树的递归和非递归遍历

原创 2018年01月02日 18:13:31

二叉树的遍历

  • 前序遍历:
    遍历顺序:根节点,左子树,右子树
    递归遍历:访问根节点,递归调用再访问左子树,右子树
//前序遍历
    void PrevOrder()
    {
        _PrevOrder(_root);
        cout << endl;
    }
    void _PrevOrder(Node* root)
    {
        if (root == NULL)
        {
            return;
        }
        cout << root->_data << " ";//根节点
        _PrevOrder(root->_leftNode);//左子树
        _PrevOrder(root->_rightNode);//右子树
    }

非递归遍历:压入根节点的左子树节点并访问,取栈顶元素,对其右子树节点进行压栈(右子树节点作为子树的根节点说不定会有左子树节点)。

这里写图片描述

//前序遍历
    void PrevOrder_NonR()
    {
        Node* cur = _root;
        stack<Node*> s;
        while (cur || !s.empty())
        {
            while (cur)
            {
                cout << cur->_data << " ";
                s.push(cur);
                cur = cur->_leftNode;
            }
            Node* top = s.top();
            cur = top->_rightNode;
            s.pop();
        }
        cout << endl;
    }
  • 中序遍历
    遍历顺序:左子树,根节点,右子树
    递归遍历:递归调用左子树并访问,根节点,再右子树
//中序遍历
    void InOrder()
    {
        _InOrder(_root);
        cout << endl;
    }
    void _InOrder(Node* root)
    {
        if (root == NULL)
        {
            return;
        }
        _InOrder(root->_leftNode);//左子树
        cout << root->_data << " ";//根节点
        _InOrder(root->_rightNode);//右子树
    }

非递归遍历:
和前序遍历一样,建立栈将根节点的左子树节点压入,但不访问。在取栈顶元素的时候对节点进行访问。

//中序遍历
    void InOrder_NonR()
    {
        Node* cur = _root;
        stack<Node*> s;
        while (cur || !s.empty())
        {
            //压入根节点的左子树节点
            while (cur)
            {
                s.push(cur);
                cur = cur->_leftNode;
            }
            //取栈顶元素并进行访问
            Node* top = s.top();
            cout << top->_data << " ";
            s.pop();
            //对右子树节点进行遍历
            cur = top->_rightNode;
        }
        cout << endl;
    }
  • 后序遍历
    遍历顺序:左子树,右子树,根节点
    递归遍历:
//后序遍历
    void PostOrder()
    {
        _PostOrder(_root);
        cout << endl;
    }
    void _PostOrder(Node* root)
    {
        if (root == NULL)
        {
            return;
        }
        _PostOrder(root->_leftNode);//左子树
        _PostOrder(root->_rightNode);//右子树
        cout << root->_data << " ";//根节点
    }

非递归遍历:
左子树节点遍历后不能对直接取栈顶元素进行pop操作,需要对其右子树节点进行判断,这里需要记录上次访问的节点prevNode,右子树节点为空或右子树节点为上次访问过的节点,都说明此子树已经遍历完成。

这里写图片描述

//后序遍历
    void PostOrder_NonR()
    {
        Node* cur = _root;
        Node* prevNode = NULL;//记录上次访问的节点
        stack<Node*> s;
        while (cur || !s.empty())
        {
            while (cur)
            {
                s.push(cur);
                cur = cur->_leftNode;
            }
            Node* top = s.top();
            if (top->_rightNode == NULL || top->_rightNode == prevNode)
            {
                cout << top->_data << " ";
                s.pop();
                prevNode = top;
            }
            else
            {
                cur = top->_rightNode;
            }
        }
        cout << endl;
    }


  • 层序遍历

  1. 利用队列先进先出的特点,将根节点压进队列,如果此根节点存在左子树节点和右子树节点,就将根节点先出队列,再将左子树节点和右子树节点进队列;
  2. 此次进入的左右子树节点也会作为根节点有其对应的左右子树节点,再进行根节点出队列,左右子树节点进队列操作即可,直至所有节点全被遍历。
//层序遍历
    void LevelOrder()
    {
        queue<Node*> q;
        if (_root)
        {
            q.push(_root);
        }
        while (!q.empty())
        {
            Node* front = q.front();
            cout << front->_data << " ";
            q.pop();
            if (front->_leftNode)
            {
                q.push(front->_leftNode);
            }
            if (front->_rightNode)
            {
                q.push(front->_rightNode);
            }
        }
        cout << endl;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

【数据结构与算法】二叉树递归与非递归遍历(附完整源码)

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但...
  • mmc_maodun
  • mmc_maodun
  • 2013年10月24日 08:58
  • 40318

java使用递归,非递归方式实现二叉树的三种常见遍历方式

二叉树的定义: 二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有一...
  • lr131425
  • lr131425
  • 2017年03月07日 10:48
  • 2273

二叉树的实现(递归遍历和非递归遍历)C++

二叉树的操作,使用栈构建一棵二叉树,然后求树高,递归先序遍历,中序遍历,后序遍历,访问左节点,访问右节点,非递归先序遍历输出,非递归中序遍历输出,非递归后序遍历输出。...
  • J_Anson
  • J_Anson
  • 2015年11月06日 00:32
  • 3377

二叉树的非递归遍历

  • 2014年11月04日 12:39
  • 3KB
  • 下载

二叉树的非递归遍历

  • 2012年10月20日 18:08
  • 344KB
  • 下载

二叉树非递归遍历

  • 2013年03月09日 13:50
  • 38KB
  • 下载

二叉树非递归遍历

  • 2013年01月13日 16:21
  • 3KB
  • 下载

二叉树的非递归遍历 C++

  • 2011年12月08日 20:42
  • 4KB
  • 下载

二叉树非递归遍历C

  • 2013年09月18日 15:14
  • 4KB
  • 下载

二叉树非递归遍历 课设

  • 2010年01月04日 21:39
  • 267KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的递归和非递归遍历
举报原因:
原因补充:

(最多只允许输入30个字)