二叉树的遍历 《算法导论》10.4-1~10.4-3

Posted meixiaogua

tags:

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

  • 10.4-1 那棵树就长成下面这个样子
  /*
            18
        12       10
      7    4   2    21
          5
    */
  • 下面就借用10.4-1提供的数据,构建一棵树,然后分别对它做10.4-2所要求的递归遍历和10.4-3所要求的非递归遍历。

    递归遍历的方式有三种,前序、中序、后序,实现上的差异,无非是把Traverse1(Index)函数里后三句的顺序换一换。

    非递归遍历的方式有两种,利用栈和利用队列,若选择栈则只能前序遍历,因为当把当前节点的孩子信息入栈之后,当前节点的位置信息便不再保存了,必须当即访问,所以当前节点总是先于其孩子被访问。同样的道理,选择队列也只能前序遍历。
    ~~~

    include

    include

    using namespace std;

class BinaryTree
{
public:
using Index = int;
BinaryTree();

//O(n)-time recursive traverse 10.4-2
void Traverse1() const;
void Traverse1(Index root) const;

//O(n)-time nonrecursive traverse10.4-3
void Traverse2() const;

private:
struct Node
{
int key;
Index left;
Index right;
};

Node m_array[11];
Index m_root;

};

BinaryTree::BinaryTree()
{
m_root = 6;
m_array[1] = Node{12,7,3};
m_array[3] = Node{4,10,-1};
m_array[4] = Node{10,5,9};
m_array[5] = Node{2,-1,-1};
m_array[6] = Node{18,1,4};
m_array[7] = Node{7,-1,-1};
m_array[9] = Node{21,-1,-1};
m_array[10] = Node{5,-1,-1};
}

void BinaryTree::Traverse1() const
{
Traverse1(m_root);
}
void BinaryTree::Traverse1(Index root) const
{
if(root == -1)
return;
cout << m_array[root].key << " ";
Traverse1(m_array[root].left);
Traverse1(m_array[root].right);
}

void BinaryTree::Traverse2() const
{
stack

void Test()
{
BinaryTree tree;
tree.Traverse1();
cout << endl;
tree.Traverse2();
}
/* 调用Test,运行结果为
18 12 7 4 5 10 2 21
18 12 7 4 5 10 2 21
*/
~~~















































以上是关于二叉树的遍历 《算法导论》10.4-1~10.4-3的主要内容,如果未能解决你的问题,请参考以下文章

《数据结构》遍历二叉树的非递归算法的疑问。

二叉树的实验--二叉树的主要遍历算法

算法基础:二叉树的遍历

二叉树的遍历算法

c++如何用非递归的算法去创建二叉树,有没有分层建立二叉树的方法

实验:二叉树的递归遍历算法