解题思路:
一开始想到递归,发现用递归很难保证节点的访问顺序。(递归对于先,中,后序遍历都有效,但是对于层次遍历似乎没有找到可行的方法)
按照层次遍历二叉树的做法,通常用一个队列来保证节点按照先入先出的顺序来。这题的关键是如何在使用队列时确定当前所处的层次,以保证输出的每一层节点为一行。
解决办法是设置两个游标cur和last,cur指向当前处理的节点,last指向当前层的最后一个节点的下一个位置。每次内循环都是输出一整层的节点,并将它们的子节点入队列。
void PrintNodeByLevel(const Node *root){ vector<const Node*> vec; vec.push_back(root); int cur = 0, last; int num =1; while(cur < vec.size()){ last = vec.size(); while(cur != last){ const Node *p = vec[cur]; cout << p->data; cur++; if (p->lchild){ vec.push_back(p->lchild); } if (p->rchild){ vec.push_back(p->rchild); } } cout << endl; } }