码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-10-15 20:48:10      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:选择   space   array   void   二叉树的遍历   roo   ==   time   binary   

  • 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 << "\t";
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

标签:选择   space   array   void   二叉树的遍历   roo   ==   time   binary   

原文地址:https://www.cnblogs.com/meixiaogua/p/9792710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!