按之字行打印二叉树

题目描述:

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

思路:我们首先确定用哪种容器来实现,这里我们用两个栈实现比较简单,栈遵循先进后出的原则,并且只允许在固定的一端进行插入和删除元素操作。这里我用一个图来解释

/*
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;
        if( pRoot != NULL)
        {
            stack<TreeNode*> stack1, stack2;//定义两个栈,一个栈放奇数行,一个栈放偶数
            stack1.push( pRoot);
            while(!stack1.empty() || !stack2.empty() )//判断栈里面的元素是否为空
            {
                vector<int> ret1,ret2;//定义两个容器,一个容器放奇数行数据,一个容器放偶数行数据
                TreeNode* cur = NULL;
                while( stack1.empty()==0)//判断是否为空
                {
                  //偶数行放栈2
                    cur = stack1.top();//栈顶元素
                    if( cur->left)//让偶数从右往左打印,所以将栈1元素的孩子从左往右压栈2
                        stack2.push(cur->left);
                    if(cur->right)
                        stack2.push(cur->right);
                    ret1.push_back(stack1.top()->val);  //保存奇数行数据
                    stack1.pop();//出栈(先进的后出)
                }
                if(ret1.size())
                    result.push_back(ret1);//将奇数行数据整体保存到result容器中
 
                while( !stack2.empty())
                {
                    //奇数行放栈1
                    cur = stack2.top();//比如1已经打印了,此时首先访问5(后进的先出),
                    //它的右孩子进栈2(为了奇数行从右往左打印数据)
                    if(cur->right)
                        stack1.push( cur->right);
                    if(cur->left)
                        stack1.push( cur->left);
 
                    ret2.push_back(stack2.top()->val); //保存偶数行数据
                    stack2.pop();
                }
                if(ret2.size())
                    result.push_back(ret2);
            }
 
        }
        return result;
    }
    
};

猜你喜欢

转载自blog.csdn.net/pigdwh/article/details/82116980