[剑指offer]刷题笔记


  • 按之字顺序打印二叉树

  • 把二叉树打印成多行


按之字顺序打印二叉树【树】【常考!!!】

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

我的想法:类似于二叉树的层次遍历,是奇数行的用队列从左向右遍历,偶数行的逆序。

class Solution {
public:
  //奇数行从左往右打印 偶数行从右往左打印
  vector<vector<int> > Print(TreeNode* pRoot) {
      vector<vector<int>> res;
      if(pRoot==NULL)
          return res;
      TreeNode* p=pRoot;
      queue<TreeNode*> que;  //定义一个队列用来从左向右输出的
      bool even=false;  //判断是不是偶数 一开始是1是奇数
      que.push(p);
      while(!que.empty())
      {
          vector<int> vec;    //这个是局部变量否则每次都会把前边的在输出一遍
          int size=que.size();
          for(int i=0;i<size;i++)
          {
              //类似于二叉树的层次遍历
              TreeNode* head=que.front();
              que.pop();
              vec.push_back(head->val);
              if(head->left!=NULL)
                  que.push(head->left);
              if(head->right!=NULL)
                  que.push(head->right);
          }
          if(even)  //是偶数的时候要反转
          {
              reverse(vec.begin(), vec.end());
          }
          res.push_back(vec);
          even=!even;
      }
      return res;
  }
};

栈的方法


public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        int layer = 1;
        //s1存奇数层节点
        Stack<TreeNode> s1 = new Stack<TreeNode>();
        s1.push(pRoot);
        //s2存偶数层节点
        Stack<TreeNode> s2 = new Stack<TreeNode>();
         
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
         
        while (!s1.empty() || !s2.empty()) {
            if (layer%2 != 0) {
                ArrayList<Integer> temp = new ArrayList<Integer>();
                while (!s1.empty()) {
                    TreeNode node = s1.pop();
                    if(node != null) {
                        temp.add(node.val);
                        System.out.print(node.val + " ");
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
                if (!temp.isEmpty()) {
                    list.add(temp);
                    layer++;
                    System.out.println();
                }
            } else {
                ArrayList<Integer> temp = new ArrayList<Integer>();
                while (!s2.empty()) {
                    TreeNode node = s2.pop();
                    if(node != null) {
                        temp.add(node.val);
                        System.out.print(node.val + " ");
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
                if (!temp.isEmpty()) {
                    list.add(temp);
                    layer++;
                    System.out.println();
                }
            }
        }
        return list;
    }

上道题变形:把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

class Solution {
public:
      vector<vector<int> > Print(TreeNode* pRoot) {
          vector<vector<int>> res;
          if(pRoot==NULL)
              return res;
          queue<TreeNode *> que;
          TreeNode* p=pRoot;
          que.push(p);
          while(!que.empty())
          {
              int size=que.size();   //每次都是一个新的队列
              vector<int> vec;  //每次都是一个新的数组
              for(int i=0;i<size;i++)
              {
                  TreeNode* head=que.front();
                  vec.push_back(head->val);
                  que.pop();
                  if(head->left!=NULL)
                      que.push(head->left);
                  if(head->right!=NULL)
                      que.push(head->right);
                  
              }
              res.push_back(vec);
          }
          return res;
      }
  
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按...
    林孖琸阅读 283评论 0 0
  • 因为剑指offer的题目比较简单,所以就做成合集了,刷一题更新一题。 1 二位数组中的查找 在一个二维数组中(每个...
    过年啦阅读 610评论 0 0
  • 要求:不仅仅能实现相应的功能,还需要保证代码的鲁棒性,并且能够分析代码的空间复杂度和时间复杂度。 二维数组中的查找...
    二十四桥客_阅读 982评论 0 1
  • 调整数组顺序使奇数位于偶数前面 复杂链表的复制 二叉搜索树与双向链表 调整数组顺序使奇数位于偶数前面【数组】 题目...
    毛十三_阅读 284评论 0 0
  • 1.二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从...
    linjiason阅读 749评论 0 0