【剑指Offer】面试题61:按之字形顺序打印二叉树

来源:互联网 发布:热云数据融资 编辑:程序博客网 时间:2024/06/05 17:24

整理自剑指Offer


一:题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。


二:解题思路

以上面的例子为例:

第一层:1 从左往右打印

第二层:2,3 从右往左打印

第三层:4,5,6,7,从左往右打印

第四层:8,9,10,11,12,13,14,15 从右往左打印


我们可以看出 第二层相当于 第一层左右子树入栈后的出栈顺序

                       第三层相当于 第二层出栈顺序(3,2),右左子树入栈后的出栈顺序

所以整个流程可以利用栈来实现,不过奇偶层数的不同入栈的书序也不同,所以我们使用两个栈。

偶数栈:先左后右入栈

奇数栈:先右后左入栈


三:代码实现

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    vector<vector<int> > Print(TreeNode* pRoot) {        vector<vector<int> > result;        vector<int> temp;                if(pRoot==NULL)            return result;                stack<TreeNode* > oddStack;        stack<TreeNode* > evenStack;                oddStack.push(pRoot);        while(!oddStack.empty() || !evenStack.empty()){            int topNum;            TreeNode* pNode;                        //打印奇数行,从左向右(从1开始)            while(!oddStack.empty()){                pNode=oddStack.top();                topNum=pNode->val;                oddStack.pop();                                 temp.push_back(topNum);               //下一层从右往左打印,左子树先入栈,右子树再入栈(栈后进先出)                if(pNode->left!=NULL)                evenStack.push(pNode->left);                if(pNode->right!=NULL)                evenStack.push(pNode->right);            }            //注意了!!!            if(temp.size()!=0)            result.push_back(temp);            temp.clear();                        //打印偶数行,从右向左            while(!evenStack.empty()){                pNode=evenStack.top();                topNum=pNode->val;                evenStack.pop();                                temp.push_back(topNum);                //下一层从左往右打印。右子树先入栈,左子树再入栈                if(pNode->right!=NULL)                    oddStack.push(pNode->right);                if(pNode->left!=NULL)                    oddStack.push(pNode->left);            }             //注意了!!!            if(temp.size()!=0)            result.push_back(temp);            temp.clear();                    }        return result;    }    };


阅读全文
0 0
原创粉丝点击