劍指offer刷題:之字形打印二叉樹

之字形打印二叉樹,例子如下所示:
採用兩個棧來實現之字形打印,兩個棧分別存儲奇數和偶數行二叉樹的節點

/*
 *            1
 *           / \
 *          2   3
 *         / \  /
 *        4   5 6
 *
 */

#include <iostream>
#include <vector>
#include <string>
#include <stack>

using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x): val(x),left(NULL),right(NULL) { }
};

vector<vector<int>> print(TreeNode* root)
{
    vector<vector<int>> ret;
    if(root == NULL)
        return ret;
    stack<TreeNode*> odd,even;
    odd.push(root);
    while(odd.size()!= 0 || even.size() != 0)
    {
        TreeNode* temp;
        vector<int> vtemp;
        while(odd.size() != 0)
        {
            temp = odd.top();
            odd.pop();
            vtemp.push_back(temp->val);
            if(temp->left)
                even.push(temp->left);
            if(temp->right)
                even.push(temp->right);
        }
        if(vtemp.size()!=0)
            ret.push_back(vtemp);
        vector<int>().swap(vtemp);
        while(even.size()!=0)
        {
            temp = even.top();
            even.pop();
            vtemp.push_back(temp->val);
            if(temp->right)
                odd.push(temp->right);
            if(temp->left)
                odd.push(temp->left);
        }
        if(vtemp.size()!=0)
        {
            ret.push_back(vtemp);
        }
    }
    return ret;

}


int main()
{
    TreeNode* p1 = new TreeNode(1);
    TreeNode* p2 = new TreeNode(2);
    TreeNode* p3 = new TreeNode(3);
    TreeNode* p4 = new TreeNode(4);
    TreeNode* p5 = new TreeNode(5);
    TreeNode* p6 = new TreeNode(6);

    p1->left = p2;
    p1->right = p3;
    p2->left = p4;
    p2->right = p5;
    p3->left = p6;
    TreeNode* root = p1;

    vector<vector<int>> ret;
    ret = print(root);
    for(int i = 0;i<ret.size();i++)
    {
        for(int j = 0;j<ret[i].size();j++)
        {
            cout << ret[i][j] << " ";
        }
        cout << endl;
    }
}

上例中的輸出爲
1
3 2
4 5 6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章