<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.樹(shù)的子結(jié)構(gòu)

      一、題目:樹(shù)的子結(jié)構(gòu)

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

        該二叉樹(shù)的節(jié)點(diǎn)定義如下,這里使用C#語(yǔ)言描述:

          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 核心步驟

        要查找樹(shù)A中是否存在和樹(shù)B結(jié)構(gòu)一樣的子樹(shù),我們可以分成兩步:

        Step1.在樹(shù)A中找到和B的根結(jié)點(diǎn)的值一樣的結(jié)點(diǎn)R;

        Step2.判斷樹(shù)A中以R為根結(jié)點(diǎn)的子樹(shù)是不是包含和樹(shù)B一樣的結(jié)構(gòu)。

        很明顯,這是一個(gè)遞歸的過(guò)程。

      2.2 代碼實(shí)現(xiàn)

          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);
                  }
                  // 從根節(jié)點(diǎn)的左子樹(shù)開(kāi)始匹配Tree2
                  if (!result)
                  {
                      result = HasSubTree(root1.leftChild, root2);
                  }
                  // 如果左子樹(shù)沒(méi)有匹配成功則繼續(xù)在右子樹(shù)中繼續(xù)匹配Tree2
                  if (!result)
                  {
                      result = HasSubTree(root1.rightChild, root2);
                  }
              }
      
              return result;
          }
      
          private static bool DoesTree1HasTree2(BinaryTreeNode root1, BinaryTreeNode root2)
          {
              if (root2 == null)
              {
                  // 證明Tree2已經(jīng)遍歷結(jié)束,匹配成功
                  return true;
              }
      
              if (root1 == null)
              {
                  // 證明Tree1已經(jīng)遍歷結(jié)束,匹配失敗
                  return false;
              }
      
              if (root1.Data != root2.Data)
              {
                  return false;
              }
              // 遞歸驗(yàn)證左子樹(shù)和右子樹(shù)是否包含Tree2
              return DoesTree1HasTree2(root1.leftChild, root2.leftChild) && DoesTree1HasTree2(root1.rightChild, root2.rightChild);
          }

      三、單元測(cè)試

        為了方便測(cè)試,這里封裝了一個(gè)設(shè)置指定根節(jié)點(diǎn)的左孩子和右孩子節(jié)點(diǎn)的方法:SetSubTreeNode

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

      3.1 功能測(cè)試

          // 01.樹(shù)中結(jié)點(diǎn)含有分叉,樹(shù)B是樹(shù)A的子結(jié)構(gòu)
          //                  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.樹(shù)中結(jié)點(diǎn)含有分叉,樹(shù)B不是樹(shù)A的子結(jié)構(gòu)
          //                  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 特殊輸入測(cè)試

          // 03.樹(shù)中結(jié)點(diǎn)只有左子結(jié)點(diǎn),樹(shù)B是樹(shù)A的子結(jié)構(gòu)
          //                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.樹(shù)中結(jié)點(diǎn)只有左子結(jié)點(diǎn),樹(shù)B不是樹(shù)A的子結(jié)構(gòu)
          //                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.樹(shù)中結(jié)點(diǎn)只有右子結(jié)點(diǎn),樹(shù)B是樹(shù)A的子結(jié)構(gòu)
          //       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.樹(shù)中結(jié)點(diǎn)只有右子結(jié)點(diǎn),樹(shù)B不是樹(shù)A的子結(jié)構(gòu)
          //       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.樹(shù)A為空樹(shù)
          [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.樹(shù)B為空樹(shù)
          [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.樹(shù)A和樹(shù)B都為空樹(shù)
          [TestMethod]
          public void HasSubTreeTest9()
          {
              Assert.AreEqual(SubTreeHelper.HasSubTree(null, null), false);
          }

      3.3 測(cè)試結(jié)果

        (1)測(cè)試通過(guò)情況

        (2)代碼覆蓋率

       

      posted @ 2015-08-30 23:05  EdisonZhou  閱讀(4487)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 麻豆一区二区中文字幕| 国产伦视频一区二区三区| 国产午夜福利视频合集| 国产a在视频线精品视频下载| 亚洲国产成人久久77| 久久国产精品不只是精品| 久久精品夜夜夜夜夜久久| 久久蜜臀av一区三区| 色综合色综合久久综合频道| 国产不卡一区二区精品| 少妇人妻无码专区视频| 亚洲综合色网一区二区三区| 日韩一级伦理片一区二区| 人妻精品动漫h无码| 91精品国产免费人成网站| 亚洲欧洲精品成人久久曰| 手机无码人妻一区二区三区免费| 日本人妻巨大乳挤奶水免费| 日韩午夜福利片段在线观看| 欧美三级中文字幕在线观看| 亚洲国产欧美在线人成| 资源新版在线天堂偷自拍| 男人的天堂av一二三区| 亚洲国产欧美在线观看片| 亚洲国产精品久久无人区| 国产精品v欧美精品∨日韩 | 亚洲中文字幕一区二区| 亚洲无av中文字幕在线| 精品人妻伦一二三区久久aaa片| 国产99在线 | 欧美| 亚洲人成人一区二区三区| 综合亚洲网| 性XXXX视频播放免费直播| 激情国产一区二区三区四区| 亚洲色欲在线播放一区二区三区 | 视频一区视频二区在线视频| 欧美牲交a欧美牲交aⅴ免费真| 国产一区二区三区不卡视频| 国产精品va在线观看无码| 国产成人亚洲日韩欧美| 午夜av高清在线观看|