面试题67:把二叉树打印成多行

来源:互联网 发布:双肩电脑背包 知乎 编辑:程序博客网 时间:2024/04/29 00:03

题目:

从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。

思路:

其实还是按层遍历,用队列可以实现。关键是如何每一层打印一行。

可以重新定义一个结构:

struct Com{Node *node;int level;Com(Node *_node, int _level) :node(_node), level(_level){}};
每次往队列取出元素时,如果与当前要输出的层相同,直接输出,如果不同,则先输出换行,再输出。

每次往队列增加元素时,带上该结点所在的层。

Q.push(Com(temp.node->left, temp.level + 1));
实现如下:

#include <iostream>    #include <vector>    #include <queue>using namespace std;struct Node{int val;Node *left;Node *right;Node(int _val) :val(_val), left(NULL), right(NULL){}};struct Com{Node *node;int level;Com(Node *_node, int _level) :node(_node), level(_level){}};void PrintByLevel(Node *root){if (!root) return;queue<Com> Q;Q.push(Com(root, 1));int outLevel = 1;while (!Q.empty()){Com temp = Q.front();Q.pop();if (temp.level == outLevel)cout << temp.node->val << " ";else{outLevel = temp.level;cout << endl;cout << temp.node->val << " ";}if (temp.node->left) Q.push(Com(temp.node->left, temp.level + 1));if (temp.node->right) Q.push(Com(temp.node->right, temp.level + 1));}cout << endl;}int main(){Node *n1 = new Node(1);Node *n2 = new Node(2);Node *n3 = new Node(2);Node *n4 = new Node(4);Node *n5 = new Node(5);Node *n6 = new Node(5);Node *n7 = new Node(4);Node *n8 = new Node(3);n1->left = n2;n1->right = n3;n2->left = n4;n2->right = n5;n3->left = n6;n3->right = n7;n7->right = n8;PrintByLevel(n1);return 0;}




0 0