标签:选择 space array void 二叉树的遍历 roo == time binary
/*
18
12 10
7 4 2 21
5
*/
下面就借用10.4-1提供的数据,构建一棵树,然后分别对它做10.4-2所要求的递归遍历和10.4-3所要求的非递归遍历。
递归遍历的方式有三种,前序、中序、后序,实现上的差异,无非是把Traverse1(Index)函数里后三句的顺序换一换。
非递归遍历的方式有两种,利用栈和利用队列,若选择栈则只能前序遍历,因为当把当前节点的孩子信息入栈之后,当前节点的位置信息便不再保存了,必须当即访问,所以当前节点总是先于其孩子被访问。同样的道理,选择队列也只能前序遍历。
~~~
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
*/
~~~
标签:选择 space array void 二叉树的遍历 roo == time binary
原文地址:https://www.cnblogs.com/meixiaogua/p/9792710.html