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

    题目描述

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

    解题思路

    考虑用两个栈分别记录各层节点:s1记录奇数层节点,s2记录偶数层节点。首先把根节点推入s1,设置bool型变量isOdd记录是否为奇数层并置为true,然后开始遍历二叉树:

    • 若该层为奇数层,则取出s1栈顶结点,将其加入到vector中,并依次把其左子节点、右子节点加入栈s2,这样偶数层从s2栈顶开始打印的顺序就是从右至左。若s1中结点已全部被取出,说明该奇数层已打印完毕,所以将vector加入到解集中,并清空此vector,然后将isOdd置为false。
    • 若该层为偶数层,则取出s2栈顶结点,将其加入到vector中,并依次把其右子节点、左子节点加入栈s1,这样奇数层从s1栈顶开始打印的顺序就是从左至右。若s2中结点已全部被取出,说明该偶数层已打印完毕,所以将vector加入到解集中,并清空此vector,然后将isOdd置为true。

    最后若两个栈均为空,说明二叉树已打印完毕,返回vector的集合。

    代码

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };
    10 */
    11 class Solution {
    12 public:
    13     vector<vector<int> > Print(TreeNode* pRoot) {
    14         vector<vector<int> > vs;
    15         if(pRoot){
    16             stack<TreeNode*> s1,s2;
    17             s1.push(pRoot);
    18             bool isOdd=true;
    19             vector<int> v;
    20             while(s1.size()||s2.size()){
    21                 //奇数层依次把左子节点、右子节点加入栈s2
    22                 if(isOdd){
    23                     TreeNode* node=s1.top();
    24                     s1.pop();
    25                     v.push_back(node->val);
    26                     if(node->left)
    27                         s2.push(node->left);
    28                     if(node->right)
    29                         s2.push(node->right);
    30                     if(s1.empty()){
    31                         isOdd=false;
    32                         vs.push_back(v);
    33                         v.clear();
    34                     }
    35                 }
    36                 //偶数层依次把右子节点、左子节点加入栈s1
    37                 else{
    38                     TreeNode* node=s2.top();
    39                     s2.pop();
    40                     v.push_back(node->val);
    41                     if(node->right)
    42                         s1.push(node->right);
    43                     if(node->left)
    44                         s1.push(node->left);
    45                     if(s2.empty()){
    46                         isOdd=true;
    47                         vs.push_back(v);
    48                         v.clear();
    49                     }
    50                 }
    51             }
    52         }
    53         return vs;
    54     }
    55     
    56 };
  • 相关阅读:
    关于 省赛模拟赛(迪迦桑专场)
    ZOJ3878: Convert QWERTY to Dvorak(浙江省赛2015)
    Is It A Tree?
    Escape
    关于细节
    [UE4]AnimDynamics简介
    [UE4]武器碰撞
    [UE4]CustomAnimationBlueprintNode 自定义动画蓝图节点
    百钱买白鸡
    asp.net 标准控件的重要属性
  • 原文地址:https://www.cnblogs.com/wmx24/p/8930800.html
Copyright © 2011-2022 走看看