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

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

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

      劍指Offer面試題:17.樹的子結構

      一、題目:樹的子結構

      題目:輸入兩棵二叉樹A和B,判斷B是不是A的子結構。例如下圖中的兩棵二叉樹,由于A中有一部分子樹的結構和B是一樣的,因此B是A的子結構。

        該二叉樹的節點定義如下,這里使用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 核心步驟

        要查找樹A中是否存在和樹B結構一樣的子樹,我們可以分成兩步:

        Step1.在樹A中找到和B的根結點的值一樣的結點R;

        Step2.判斷樹A中以R為根結點的子樹是不是包含和樹B一樣的結構。

        很明顯,這是一個遞歸的過程。

      2.2 代碼實現

          public static bool HasSubTree(BinaryTreeNode root1, BinaryTreeNode root2)
          {
              bool result = false;
      
              if (root1 != null && root2 != null)
              {
                  if (root1.Data == root2.Data)
                  {
                      result = DoesTree1HasTree2(root1, root2);
                  }
                  // 從根節點的左子樹開始匹配Tree2
                  if (!result)
                  {
                      result = HasSubTree(root1.leftChild, root2);
                  }
                  // 如果左子樹沒有匹配成功則繼續在右子樹中繼續匹配Tree2
                  if (!result)
                  {
                      result = HasSubTree(root1.rightChild, root2);
                  }
              }
      
              return result;
          }
      
          private static bool DoesTree1HasTree2(BinaryTreeNode root1, BinaryTreeNode root2)
          {
              if (root2 == null)
              {
                  // 證明Tree2已經遍歷結束,匹配成功
                  return true;
              }
      
              if (root1 == null)
              {
                  // 證明Tree1已經遍歷結束,匹配失敗
                  return false;
              }
      
              if (root1.Data != root2.Data)
              {
                  return false;
              }
              // 遞歸驗證左子樹和右子樹是否包含Tree2
              return DoesTree1HasTree2(root1.leftChild, root2.leftChild) && DoesTree1HasTree2(root1.rightChild, root2.rightChild);
          }

      三、單元測試

        為了方便測試,這里封裝了一個設置指定根節點的左孩子和右孩子節點的方法:SetSubTreeNode

          public void SetSubTreeNode(BinaryTreeNode root, BinaryTreeNode lChild, BinaryTreeNode rChild)
          {
              if (root == null)
              {
                  return;
              }
      
              root.leftChild = lChild;
              root.rightChild = rChild;
          }
      View Code

      3.1 功能測試

          // 01.樹中結點含有分叉,樹B是樹A的子結構
          //                  8                8
          //              /       \           / \
          //             8         7         9   2
          //           /   \
          //          9     2
          //               / \
          //              4   7
          [TestMethod]
          public void HasSubTreeTest1()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(7);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA6 = new BinaryTreeNode(4);
              BinaryTreeNode nodeA7 = new BinaryTreeNode(7);
      
              SetSubTreeNode(nodeA1, nodeA2, nodeA3);
              SetSubTreeNode(nodeA2, nodeA4, nodeA5);
              SetSubTreeNode(nodeA5, nodeA6, nodeA7);
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(2);
      
              SetSubTreeNode(nodeB1, nodeB2, nodeB3);
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), true);
          }
      
          // 02.樹中結點含有分叉,樹B不是樹A的子結構
          //                  8                8
          //              /       \           / \
          //             8         7         9   2
          //           /   \
          //          9     3
          //               / \
          //              4   7
          [TestMethod]
          public void HasSubTreeTest2()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(7);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(3);
              BinaryTreeNode nodeA6 = new BinaryTreeNode(4);
              BinaryTreeNode nodeA7 = new BinaryTreeNode(7);
      
              SetSubTreeNode(nodeA1, nodeA2, nodeA3);
              SetSubTreeNode(nodeA2, nodeA4, nodeA5);
              SetSubTreeNode(nodeA5, nodeA6, nodeA7);
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(2);
      
              SetSubTreeNode(nodeB1, nodeB2, nodeB3);
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), false);
          }

      3.2 特殊輸入測試

          // 03.樹中結點只有左子結點,樹B是樹A的子結構
          //                8                  8
          //              /                   / 
          //             8                   9   
          //           /                    /
          //          9                    2
          //         /      
          //        2        
          //       /
          //      5
          [TestMethod]
          public void HasSubTreeTest3()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(5);
      
              nodeA1.leftChild = nodeA2;
              nodeA2.leftChild = nodeA3;
              nodeA3.leftChild = nodeA4;
              nodeA4.leftChild = nodeA5;
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(2);
      
              nodeB1.leftChild = nodeB2;
              nodeB2.leftChild = nodeB3;
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), true);
          }
      
          // 04.樹中結點只有左子結點,樹B不是樹A的子結構
          //                8                  8
          //              /                   / 
          //             8                   9   
          //           /                    /
          //          9                    3
          //         /      
          //        2        
          //       /
          //      5
          [TestMethod]
          public void HasSubTreeTest4()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(5);
      
              nodeA1.leftChild = nodeA2;
              nodeA2.leftChild = nodeA3;
              nodeA3.leftChild = nodeA4;
              nodeA4.leftChild = nodeA5;
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(3);
      
              nodeB1.leftChild = nodeB2;
              nodeB2.leftChild = nodeB3;
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), false);
          }
      
          // 05.樹中結點只有右子結點,樹B是樹A的子結構
          //       8                   8
          //        \                   \ 
          //         8                   9   
          //          \                   \
          //           9                   2
          //            \      
          //             2        
          //              \
          //               5
          [TestMethod]
          public void HasSubTreeTest5()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(5);
      
              nodeA1.rightChild = nodeA2;
              nodeA2.rightChild = nodeA3;
              nodeA3.rightChild = nodeA4;
              nodeA4.rightChild = nodeA5;
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(2);
      
              nodeB1.rightChild = nodeB2;
              nodeB2.rightChild = nodeB3;
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), true);
          }
      
          // 06.樹中結點只有右子結點,樹B不是樹A的子結構
          //       8                   8
          //        \                   \ 
          //         8                   9   
          //          \                 / \
          //           9               3   2
          //            \      
          //             2        
          //              \
          //               5
          [TestMethod]
          public void HasSubTreeTest6()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(5);
      
              nodeA1.rightChild = nodeA2;
              nodeA2.rightChild = nodeA3;
              nodeA3.rightChild = nodeA4;
              nodeA4.rightChild = nodeA5;
      
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(3);
              BinaryTreeNode nodeB4 = new BinaryTreeNode(2);
      
              nodeB1.rightChild = nodeB2;
              SetSubTreeNode(nodeB2, nodeB3, nodeB4);
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, nodeB1), false);
          }
      
          // 07.樹A為空樹
          [TestMethod]
          public void HasSubTreeTest7()
          {
              BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeB2 = new BinaryTreeNode(9);
              BinaryTreeNode nodeB3 = new BinaryTreeNode(3);
              BinaryTreeNode nodeB4 = new BinaryTreeNode(2);
      
              nodeB1.rightChild = nodeB2;
              SetSubTreeNode(nodeB2, nodeB3, nodeB4);
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(null, nodeB1), false);
          }
      
          // 08.樹B為空樹
          [TestMethod]
          public void HasSubTreeTest8()
          {
              BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
              BinaryTreeNode nodeA3 = new BinaryTreeNode(9);
              BinaryTreeNode nodeA4 = new BinaryTreeNode(2);
              BinaryTreeNode nodeA5 = new BinaryTreeNode(5);
      
              nodeA1.rightChild = nodeA2;
              nodeA2.rightChild = nodeA3;
              nodeA3.rightChild = nodeA4;
              nodeA4.rightChild = nodeA5;
      
              Assert.AreEqual(SubTreeHelper.HasSubTree(nodeA1, null), false);
          }
      
          // 09.樹A和樹B都為空樹
          [TestMethod]
          public void HasSubTreeTest9()
          {
              Assert.AreEqual(SubTreeHelper.HasSubTree(null, null), false);
          }

      3.3 測試結果

        (1)測試通過情況

        (2)代碼覆蓋率

       

      posted @ 2015-08-30 23:05  EdisonZhou  閱讀(4487)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品 欧美 亚洲 制服| 蜜臀av一区二区三区精品| 日韩有码中文字幕av| 久久精品国产福利一区二区| 人人妻人人妻人人片色av| 国产午夜精品福利91| 少妇被粗大的猛进69视频| 亚洲精品久久久久久无码色欲四季| 国产深夜福利在线免费观看| 日韩成人一区二区三区在线观看| 亚洲综合在线日韩av| 丰满人妻一区二区三区无码AV| 亚洲天堂激情av在线| 国产女人喷潮视频免费| h动态图男女啪啪27报gif| 人妻少妇邻居少妇好多水在线 | 蜜桃臀无码AV在线观看| 红安县| 夜夜影院未满十八勿进| 国产精品免费中文字幕| 成年午夜性影院| 变态另类视频一区二区三区| 中文字幕av国产精品| 国产精品麻豆成人av电影艾秋| 国产精品综合av一区二区| 精品亚洲国产成人av| 国产在线视频一区二区三区| 亚洲一区二区三区自拍偷拍 | 久久国产成人av蜜臀| 欧美日韩国产综合草草| 国产精品国产三级国产a| 漂亮人妻中文字幕丝袜| 色综合天天综合天天更新| 2020久久国产综合精品swag| 日本久久99成人网站| 成人精品久久一区二区三区| 色老头亚洲成人免费影院| 久9re热视频这里只有精品免费| 中美日韩在线一区黄色大片| 高清国产一区二区无遮挡| 久久一日本综合色鬼综合色 |