zoukankan      html  css  js  c++  java
  • 剑指offer 按之字型顺序打印二叉树

    题目描述

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
     
    使用两个栈进行存储,我们在打印某一行节点的时候,需要将下一行的节点保存到相应的栈中,如果当前打印奇数层,那么先保存左子节点,再保存右子节点;
    如果我们当前打印的偶数层,那么先保存右子节点,再保存左子节点。
    注意循环退出条件。
    /*
    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) {
            stack<TreeNode*> odd;//先左后右
            stack<TreeNode*> even;//先右后左
            vector<vector<int> > result;
            if(pRoot == nullptr){
                return result;
            }
            TreeNode* p = pRoot;
            int flag = 1;
            odd.push(p);
            while(!odd.empty() || !even.empty()){
                vector<int> tmp;
                if(flag % 2){//当前奇数层
                    while(!odd.empty()){
                        p = odd.top();
                        tmp.push_back(p -> val);
                        odd.pop();
                        if(p -> left != nullptr){
                            even.push(p -> left);
                        }
                        if(p -> right != nullptr){
                            even.push(p -> right);
                        }
                    }
                    result.push_back(tmp);
                    ++flag;
                }
                else{//当前偶数层
                    while(!even.empty()){
                        p = even.top();
                        tmp.push_back(p -> val);
                        even.pop();
                        if(p -> right != nullptr){
                            odd.push(p -> right);
                        }
                        if(p -> left != nullptr){
                            odd.push(p -> left);
                        }
                        
                    }
                    result.push_back(tmp);
                    ++flag;
                }
            }
            return result;
        }
        
    };
     
     
  • 相关阅读:
    linux UID,GID,EUID,EGID,SUID,SGID
    Hard模式题目
    【Todo】Java TreeSet学习 & ceiling,floor
    被信号打断的系统调用
    拟牛顿法——变种及其相互关系
    域名注册查询接口(API)的说明
    HDU 2825 Wireless Password(AC自动机+状压DP)
    串的模式匹配
    Android DES加密的CBC模式加密解密和ECB模式加密解密
    [Web Chart系列之五] 6. 实战draw2d之ConnectionRouter
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7513248.html
Copyright © 2011-2022 走看看