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;
         
        }
         
    };
  • 相关阅读:
    第4章:kubectl命令行管理工具
    Docker_CICD笔记
    Harbor镜像仓库
    centos7 安装最新的 wiki confluence
    Centos7.5使用SSH密钥登录
    一篇文章带你搞懂 etcd 3.5 的核心特性
    腾讯云边缘容器 TKE Edge 国内首批通过边缘容器技术能力认证
    揭秘有状态服务上 Kubernetes 的核心技术
    腾讯云云原生混合云-TKE发行版
    kubernetes 降本增效标准指南|理解弹性,应用弹性
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4722286.html
Copyright © 2011-2022 走看看