## 《编程之美：分层遍历二叉树》的另外两个实现

2010-05-12 00:10 by Milo Yip, ... 阅读, ... 评论, 收藏, 编辑

## 问题定义

1
2 3
4 5 6
7 8


struct Node {
Node *pLeft;
Node *pRight;
int data;
};


## 书上的解法

void PrintNodeByLevel(Node* root) {
vector<Node*> vec; // 这里我们使用STL 中的vector来代替数组，可利用到其动态扩展的属性
vec.push_back(root);
int cur = 0;
int last = 1;
while(cur < vec.size()) {
Last = vec.size(); // 新的一行访问开始，重新定位last于当前行最后一个节点的下一个位置
while(cur < last) {
cout << vec[cur] -> data << " "; // 访问节点
if(vec[cur] -> lChild) // 当前访问节点的左节点不为空则压入
vec.push_back(vec[cur] -> lChild);
if(vec[cur] -> rChild) // 当前访问节点的右节点不为空则压入，注意左右节点的访问顺序不能颠倒
vec.push_back(vec[cur] -> rChild);
cur++;
}
cout << endl; // 当cur == last时,说明该层访问结束，输出换行符
}
}


## 广度优先搜索

enqueue(Q, root)
do
node = dequeue(Q)
process(node) //如把内容列印
for each child of node
enqueue(Q, child)
while Q is not empty


void PrintBFS(Node* root) {
queue<Node*> Q;
Q.push(root);
do {
Node *node = Q.front();
Q.pop();
cout << node->data << " ";
if (node->pLeft)
Q.push(node->pLeft);
if (node->pRight)
Q.push(node->pRight);
}
while (!Q.empty());
}


## 本人的尝试之一

void PrintNodeByLevel(Node* root) {
deque<Node*> Q1, Q2;
Q1.push_back(root);
do {
do {
Node* node = Q1.front();
Q1.pop_front();
cout << node->data << " ";
if (node->pLeft)
Q2.push_back(node->pLeft);
if (node->pRight)
Q2.push_back(node->pRight);
} while (!Q1.empty());
cout << endl;
Q1.swap(Q2);
} while(!Q1.empty());
}


## 本人的尝试之二

void PrintNodeByLevel(Node* root) {
queue<Node*> Q;
Q.push(root);
Q.push(0);
do {
Node* node = Q.front();
Q.pop();
if (node) {
cout << node->data << " ";
if (node->pLeft)
Q.push(node->pLeft);
if (node->pRight)
Q.push(node->pRight);
}
else if (!Q.empty()) {
Q.push(0);
cout << endl;
}
} while (!Q.empty());
}


## 测试代码

void Link(Node* nodes, int parent, int left, int right) {
if (left != -1)
nodes[parent].pLeft = &nodes[left];

if (right != -1)
nodes[parent].pRight = &nodes[right];
}

void main()
{
Node test1[9] = { 0 };

for (int i = 1; i < 9; i++)
test1[i].data = i;