zoukankan      html  css  js  c++  java
  • (剑指Offer)面试题61:按之字形顺序打印二叉树

    题目:

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

    思路:

    按照广度优先遍历来遍历二叉树,但是需要按照之字形来打印,意味着:

    奇数行从左到右,跟BFS的遍历顺序一样,而偶数行从右到左,跟BFS的遍历顺序相反。

    因此我们不能直接采用队列,可以通过两个栈来实现,一个实现先进先出,即入栈顺序为右子节点、左子节点;一个实现后进先出,即入栈顺序为左子节点、右子节点。(具体参照代码)

    在线测试:

    http://www.nowcoder.com/books/coding-interviews/91b69814117f4e8097390d107d2efbe0?rp=3

    AC代码:

    /*
    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)
                return result;
             
            stack<TreeNode*> stk1;
            stack<TreeNode*> stk2;
            stk1.push(pRoot);
            TreeNode* tmp;
            vector<int> tLevel;
             
            while(!stk1.empty() || !stk2.empty())
            {
                if(!stk1.empty())
                {
                    while(!stk1.empty())
                    {
                        tmp=stk1.top();
                        tLevel.push_back(tmp->val);
                        if(tmp->left)
                            stk2.push(tmp->left);
                        if(tmp->right)
                            stk2.push(tmp->right);
                        stk1.pop();
                    }
                    result.push_back(tLevel);
                    tLevel.clear();
                }
                else
                {
                    while(!stk2.empty())
                    {
                        tmp=stk2.top();
                        tLevel.push_back(tmp->val);
                        if(tmp->right)
                            stk1.push(tmp->right);
                        if(tmp->left)
                            stk1.push(tmp->left);
                        stk2.pop();
                    }
                    result.push_back(tLevel);
                    tLevel.clear();
                }
            }
            return result;
         
        }
         
    };
  • 相关阅读:
    作业1-四则运算题目生成程序
    实验四 决策树算法及应用
    实验三朴素贝叶斯算法及应用
    自定义博客园背景
    机器学习 实验二 K-近邻算法及应用
    机器学习 实验一 感知器及其运用
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验一:软件开发文档与工具的安装与使用
    朴素贝叶斯学习日志——简单案例python计算过程
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4722286.html
Copyright © 2011-2022 走看看