编程之美 3.10 分层遍历二叉树

解题思路:

一开始想到递归,发现用递归很难保证节点的访问顺序。(递归对于先,中,后序遍历都有效,但是对于层次遍历似乎没有找到可行的方法)

按照层次遍历二叉树的做法,通常用一个队列来保证节点按照先入先出的顺序来。这题的关键是如何在使用队列时确定当前所处的层次,以保证输出的每一层节点为一行。

解决办法是设置两个游标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;
    }
}

 

posted on 2012-12-22 19:10  小龙人2012  阅读(142)  评论(0编辑  收藏  举报

导航