[劍指offer]刷題筆記


  • 按之字順序打印二叉樹(shù)

  • 把二叉樹(shù)打印成多行


按之字順序打印二叉樹(shù)【樹(shù)】【??迹。?!】

題目描述:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)按照之字形打印二叉樹(shù),即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類(lèi)推。

我的想法:類(lèi)似于二叉樹(shù)的層次遍歷,是奇數(shù)行的用隊(duì)列從左向右遍歷,偶數(shù)行的逆序。

class Solution {
public:
  //奇數(shù)行從左往右打印 偶數(shù)行從右往左打印
  vector<vector<int> > Print(TreeNode* pRoot) {
      vector<vector<int>> res;
      if(pRoot==NULL)
          return res;
      TreeNode* p=pRoot;
      queue<TreeNode*> que;  //定義一個(gè)隊(duì)列用來(lái)從左向右輸出的
      bool even=false;  //判斷是不是偶數(shù) 一開(kāi)始是1是奇數(shù)
      que.push(p);
      while(!que.empty())
      {
          vector<int> vec;    //這個(gè)是局部變量否則每次都會(huì)把前邊的在輸出一遍
          int size=que.size();
          for(int i=0;i<size;i++)
          {
              //類(lèi)似于二叉樹(shù)的層次遍歷
              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)  //是偶數(shù)的時(shí)候要反轉(zhuǎn)
          {
              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存奇數(shù)層節(jié)點(diǎn)
        Stack<TreeNode> s1 = new Stack<TreeNode>();
        s1.push(pRoot);
        //s2存偶數(shù)層節(jié)點(diǎn)
        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;
    }

上道題變形:把二叉樹(shù)打印成多行

題目描述:從上到下按層打印二叉樹(shù),同一層結(jié)點(diǎn)從左至右輸出。每一層輸出一行。

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();   //每次都是一個(gè)新的隊(duì)列
              vector<int> vec;  //每次都是一個(gè)新的數(shù)組
              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;
      }
  
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 二維數(shù)組中的查找 在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長(zhǎng)度相同),每一行都按照從左到右遞增的順序排序,每一列都按...
    林孖琸閱讀 329評(píng)論 0 0
  • 因?yàn)閯χ竜ffer的題目比較簡(jiǎn)單,所以就做成合集了,刷一題更新一題。 1 二位數(shù)組中的查找 在一個(gè)二維數(shù)組中(每個(gè)...
    過(guò)年啦閱讀 638評(píng)論 0 0
  • 要求:不僅僅能實(shí)現(xiàn)相應(yīng)的功能,還需要保證代碼的魯棒性,并且能夠分析代碼的空間復(fù)雜度和時(shí)間復(fù)雜度。 二維數(shù)組中的查找...
    二十四橋客_閱讀 1,017評(píng)論 0 1
  • 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面 復(fù)雜鏈表的復(fù)制 二叉搜索樹(shù)與雙向鏈表 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面【數(shù)組】 題目...
    毛十三_閱讀 316評(píng)論 0 0
  • 1.二維數(shù)組的查找 在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長(zhǎng)度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從...
    linjiason閱讀 779評(píng)論 0 0

友情鏈接更多精彩內(nèi)容