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

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

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

      劍指Offer面試題:25.二叉搜索樹與雙向鏈表

      一、題目:二叉搜索樹與雙向鏈表

      題目:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。比如輸入下圖中左邊的二叉搜索樹,則輸出轉換之后的排序雙向鏈表。

        二叉搜索樹的節點定義如下,這里使用C#語言描述:

          public class BinaryTreeNode
          {
              public int Data { get; set; }
              public BinaryTreeNode leftChild { get; set; }
              public BinaryTreeNode rightChild { get; set; }
      
              public BinaryTreeNode(int data)
              {
                  this.Data = data;
              }
      
              public BinaryTreeNode(int data, BinaryTreeNode left, BinaryTreeNode right)
              {
                  this.Data = data;
                  this.leftChild = left;
                  this.rightChild = right;
              }
          }

      二、解題思路

      2.1 核心步驟

        首先,我們知道:在二叉樹中,每個結點都有兩個指向子結點的指針。在雙向鏈表中,每個結點也有兩個指針,它們分別指向前一個結點和后一個結點。

        其次,由于要求轉換之后的鏈表是排好序的,我們可以中序遍歷樹中的每一個結點,這是因為中序遍歷算法的特點是按照從小到大的順序遍歷二叉樹的每一個結點。

        最后,按照中序遍歷的順序,當我們遍歷轉換到根結點(值為10的結點)時,它的左子樹已經轉換成一個排序的鏈表了,并且處在鏈表中的最后一個結點是當前值最大的結點。我們把值為8的結點和根結點鏈接起來,此時鏈表中的最后一個結點就是10了。接著我們去遍歷轉換右子樹,并把根結點和右子樹中最小的結點鏈接起來。

        很明顯,轉換它的左子樹和右子樹,由于遍歷和轉換過程是一樣的,很自然地想到可以用遞歸。

      2.2 代碼實現

          public BinaryTreeNode Convert(BinaryTreeNode root)
          {
              BinaryTreeNode lastNodeInList = null;
              ConvertNode(root, ref lastNodeInList);
      
              // lastNodeInList指向雙向鏈表的尾結點,
              // 我們需要返回頭結點
              BinaryTreeNode headInList = lastNodeInList;
              while (headInList != null && headInList.leftChild != null)
              {
                  headInList = headInList.leftChild;
              }
      
              return headInList;
          }
      
          private void ConvertNode(BinaryTreeNode node, ref BinaryTreeNode lastNodeInList)
          {
              if (node == null)
              {
                  return;
              }
      
              BinaryTreeNode currentNode = node;
              // 轉換左子樹
              if (currentNode.leftChild != null)
              {
                  ConvertNode(currentNode.leftChild, ref lastNodeInList);
              }
              // 與根節點的銜接
              currentNode.leftChild = lastNodeInList;
              if (lastNodeInList != null)
              {
                  lastNodeInList.rightChild = currentNode;
              }
              lastNodeInList = currentNode;
              // 轉換右子樹
              if (currentNode.rightChild != null)
              {
                  ConvertNode(currentNode.rightChild, ref lastNodeInList);
              }
          }

      三、單元測試

      3.1 測試用例

        (1)輔助方法的封裝

          private void SetSubTreeNode(BinaryTreeNode root, BinaryTreeNode lChild, BinaryTreeNode rChild)
          {
              if (root == null)
              {
                  return;
              }
      
              root.leftChild = lChild;
              root.rightChild = rChild;
          }
      
          private BSTConverter converter;
      
          [TestInitialize]
          public void Initialize()
          {
              converter = new BSTConverter();
          }
      
          [TestCleanup]
          public void CleanUp()
          {
              converter = null;
          }
      View Code

       ?。?)功能測試、特殊輸入測試

          //            10
          //         /      \
          //        6        14
          //       /\        /\
          //      4  8     12  16
          [TestMethod]
          public void ConvertTest1()
          {
              BinaryTreeNode node10 = new BinaryTreeNode(10);
              BinaryTreeNode node6 = new BinaryTreeNode(6);
              BinaryTreeNode node4 = new BinaryTreeNode(4);
              BinaryTreeNode node8 = new BinaryTreeNode(8);
              BinaryTreeNode node14 = new BinaryTreeNode(14);
              BinaryTreeNode node12 = new BinaryTreeNode(12);
              BinaryTreeNode node16 = new BinaryTreeNode(16);
      
              SetSubTreeNode(node10, node6, node14);
              SetSubTreeNode(node6, node4, node8);
              SetSubTreeNode(node14, node12, node16);
      
              BinaryTreeNode result = converter.Convert(node10);
              Assert.AreEqual(result, node4);
          }
      
          //               5
          //              /
          //             4
          //            /
          //           3
          //          /
          //         2
          //        /
          //       1
          [TestMethod]
          public void ConvertTest2()
          {
              BinaryTreeNode node5 = new BinaryTreeNode(5);
              BinaryTreeNode node4 = new BinaryTreeNode(4);
              BinaryTreeNode node3 = new BinaryTreeNode(3);
              BinaryTreeNode node2 = new BinaryTreeNode(2);
              BinaryTreeNode node1 = new BinaryTreeNode(1);
      
              node5.leftChild = node4;
              node4.leftChild = node3;
              node3.leftChild = node2;
              node2.leftChild = node1;
      
              BinaryTreeNode result = converter.Convert(node5);
              Assert.AreEqual(result, node1);
          }
      
          // 1
          //  \
          //   2
          //    \
          //     3
          //      \
          //       4
          //        \
          //         5
          [TestMethod]
          public void ConvertTest3()
          {
              BinaryTreeNode node5 = new BinaryTreeNode(5);
              BinaryTreeNode node4 = new BinaryTreeNode(4);
              BinaryTreeNode node3 = new BinaryTreeNode(3);
              BinaryTreeNode node2 = new BinaryTreeNode(2);
              BinaryTreeNode node1 = new BinaryTreeNode(1);
      
              node1.rightChild = node2;
              node2.rightChild = node3;
              node3.rightChild = node4;
              node4.rightChild = node5;
      
              BinaryTreeNode result = converter.Convert(node1);
              Assert.AreEqual(result, node1);
          }
      
          // 樹中只有1個結點
          [TestMethod]
          public void ConvertTest4()
          {
              BinaryTreeNode node1 = new BinaryTreeNode(1);
      
              BinaryTreeNode result = converter.Convert(node1);
              Assert.AreEqual(result, node1);
          }
      
          // 空指針
          [TestMethod]
          public void ConvertTest5()
          {
              BinaryTreeNode result = converter.Convert(null);
              Assert.AreEqual(result, null);
          } 

      3.2 測試結果

       ?。?)測試通過情況

        (2)代碼覆蓋率

       

      posted @ 2015-09-09 00:57  EdisonZhou  閱讀(5953)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 国产成人一区二区免av| 亚洲aⅴ天堂av天堂无码麻豆| 精品综合久久久久久98| 久久国产成人高清精品亚洲| 国产午夜伦伦午夜伦无码| 少妇厨房愉情理9仑片视频| 亚洲av永久无码精品漫画| 国产精品人妻熟女男人的天堂| 国产精品不卡区一区二| 东京热tokyo综合久久精品| 亚洲人成小说网站色在线 | 国产精品综合一区二区三区| 国产美女被遭强高潮免费一视频| 欧美三级中文字幕在线观看| 精品乱码一区二区三四五区| 漂亮的保姆hd完整版免费韩国| 国产日产精品系列| 国产又色又爽又高潮免费| 伊伊人成亚洲综合人网7777| 老师扒下内裤让我爽了一夜 | 爱性久久久久久久久| 夜夜爽77777妓女免费看| 国产精品日日摸夜夜添夜夜添无码| 亚洲欧美日韩综合一区二区| 国产精品青青青高清在线| 国产在线午夜不卡精品影院| 亚洲精品久久麻豆蜜桃| 熟女人妻aⅴ一区二区三区电影| av天堂亚洲天堂亚洲天堂| 日韩亚洲中文图片小说| 亚洲综合在线日韩av| 精品亚洲欧美高清不卡高清| 国产精品免费看久久久| 亚洲熟女精品一区二区| 疯狂添女人下部视频免费| 亚洲日本精品一区二区| av无码免费一区二区三区| 亚洲精品国产第一区二区| 麻豆国产AV剧情偷闻女邻居内裤| 久久精品无码av| 日本一区二区a√成人片|