<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      morris Traversal

      O(n)時間,O(1)空間對二叉樹進行前序、中序、后序遍歷。詳細講解看參考。 

       

      public class Solution {
      
          public static void morrisPreorder(TreeNode root) {
              TreeNode cur = root;
              TreeNode pre = null;
      
              while (cur != null) {
                  if (cur.left == null) {
                      System.out.print(cur.val + " ");
                      cur = cur.right;
                  } else {
                      // find predecessor
                      pre = cur.left;
                      while (pre.right != null && pre.right != cur)
                          pre = pre.right;
      
                      if (pre.right == null) {
                          System.out.print(cur.val + " ");
                          pre.right = cur;
                          cur = cur.left;
                      } else {
                          pre.right = null;
                          cur = cur.right;
                      }
      
                  }
      
              }
              System.out.println();
      
          }
      
          public static void morrisInorder(TreeNode root) {
              TreeNode cur = root;
              TreeNode pre = null;
      
              while (cur != null) {
                  if (cur.left == null) {
                      System.out.print(cur.val + " ");
                      cur = cur.right;
                  } else {
                      // find predecessor
                      pre = cur.left;
                      while (pre.right != null && pre.right != cur)
                          pre = pre.right;
      
                      if (pre.right == null) {
                          pre.right = cur;
                          cur = cur.left;
      
                      } else {
                          pre.right = null;
                          System.out.print(cur.val + " ");
                          cur = cur.right;
                      }
      
                  }
      
              }
      
              System.out.println();
          }
      
          public static void morrisPostorder(TreeNode root) {
              TreeNode dump = new TreeNode(0);
              dump.left = root;
              TreeNode cur = dump;
              TreeNode pre = null;
      
              while (cur != null) {
                  if (cur.left == null) {
                      cur = cur.right;
                  } else {
                      // find predecessor
                      pre = cur.left;
                      while (pre.right != null && pre.right != cur)
                          pre = pre.right;
      
                      if (pre.right == null) {
                          pre.right = cur;
                          cur = cur.left;
                      } else {
                          pre.right = null;
                          printRev(cur.left, pre);
                          cur = cur.right;
                      }
      
                  }
              }
              System.out.println();
      
          }
      
          private static void printRev(TreeNode from, TreeNode to) {
              reverse(from, to);
      
              TreeNode p = to;
              while (true) {
                  System.out.print(p.val + " ");
                  if (p == from)
                      break;
                  p = p.right;
              }
              reverse(to, from);
          }
      
          private static void reverse(TreeNode from, TreeNode to) {
              if (from == to)
                  return;
              TreeNode pre = from, cur = from.right, post = null;
              while (pre != to) {
                  post = cur.right;
                  cur.right = pre;
                  pre = cur;
                  cur = post;
              }
      
          }
      
          public static void main(String[] args) {
              String s = "6 2 1 # # 4 3 # # 5 # # 7 # 9 # 8 # #";
              TreeNode root = TreeUtils.makeTree(s);
              TreeUtils.printTree(root);
              morrisPreorder(root);
              morrisInorder(root);
              morrisPostorder(root);
      
          }
      
      }

       

      復雜度分析:

      空間復雜度:O(1),因為只用了兩個輔助指針。

      時間復雜度:O(n)。證明時間復雜度為O(n),最大的疑惑在于尋找中序遍歷下二叉樹中所有節點的前驅節點的時間復雜度是多少,即以下兩行代碼:

      while (pre.right != null && pre.right != cur)
          pre = pre.right;

       

      直覺上,認為它的復雜度是O(nlgn),因為找單個節點的前驅節點與樹的高度有關。但事實上,尋找所有節點的前驅節點只需要O(n)時間。n個節點的二叉樹中一共有n-1條邊,整個過程中每條邊最多只走2次,一次是為了定位到某個節點,另一次是為了尋找上面某個節點的前驅節點,如下圖所示,其中紅色是為了定位到某個節點,黑色線是為了找到前驅節點。所以復雜度為O(n)。

               

       

      參考(講的太好了):

      http://www.rzrgm.cn/AnnieKim/archive/2013/06/15/MorrisTraversal.html

      posted @ 2014-09-09 22:36  jdflyfly  閱讀(339)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 蜜桃av亚洲第一区二区| 99热成人精品热久久66| 亚洲精品天天影视综合网| 苍井空一区二区波多野结衣av| 日韩精品一区二区三区中文无码 | 不卡乱辈伦在线看中文字幕| 亚洲日韩一区二区| 巨爆乳中文字幕爆乳区| 大又大又粗又硬又爽少妇毛片| 国产精品第一页一区二区| 国产精品午夜福利91| 国产不卡av一区二区| 蜜臀av无码一区二区三区| 国产日韩久久免费影院| 老太脱裤子让老头玩xxxxx| 国产自拍偷拍视频在线观看| 另类 专区 欧美 制服丝袜| 亚洲av乱码一区二区| 亚洲色大成网站www久久九| 色综合久久人妻精品日韩| 重庆市| 久久国产精品色av免费看| 午夜成人性爽爽免费视频| 亚洲综合伊人五月天中文| 国产精品久久久久7777| 无套后入极品美女少妇| 午夜精品久久久久久久爽| 精品成人免费自拍视频| 久久久久噜噜噜亚洲熟女综合| 中国女人和老外的毛片| 五月婷之久久综合丝袜美腿| 亚洲va久久久噜噜噜久久狠狠| 国产精品视频亚洲二区| 五月丁香激激情亚洲综合| 成人午夜在线播放| 成人午夜免费无码视频在线观看| 免费无遮挡无码永久在线观看视频| 91亚洲国产成人精品性色| 亚洲av永久无码精品天堂久久| 国产69精品久久久久99尤物| 精品一区二区三区蜜桃久|