亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

用C語言判斷一個二叉樹是否為另一個的子結構

2020-01-26 14:58:58
字體:
來源:轉載
供稿:網友

1、問題描述:

     如何判斷一個二叉樹是否是另一個的子結構?
     比如:

        2
      /   /
     9    8
    / /    /
   2  3  5
  /
6

   有個子結構是
   9
  / /
2  3

2、分析問題:
    有關二叉樹的算法問題,一般都可以通過遞歸來解決。那么寫成一個正確的遞歸程序,首先一定要分析正確遞歸結束的條件。

拿這道題來講,什么時候遞歸結束。

<1>第二個二叉樹root2為空時,說明root2是第一棵二叉樹的root1的子結構,返回true。

<2>當root1為空時,此時root2還沒為空,說明root2不是root1的子結構,返回false。

<3>遞歸下面有兩種思路:

    方法一:現在root1中找結點值與root2的值相等的結點,如果找到就判斷root2是不是這個結點開頭的子結構。所以,首先IsSubTree()判斷。

    方法二:就是直接判斷,相同就遞歸判斷root2左右子樹是不是也是相應的子結構。如果值不相同,就分別遞歸到root1的左右子樹尋找。尤其要注意最后兩句遞歸的邏輯判斷。

3、習題實例

    題目描述:  
    輸入兩顆二叉樹A,B,判斷B是不是A的子結構。 
    輸入: 
    輸入可能包含多個測試樣例,輸入以EOF結束。 
    對于每個測試案例,輸入的第一行一個整數n,m(1<=n<=1000,1<=m<=1000):n代表將要輸入的二叉樹A的節點個數(節點從1開始計數),m代表將要輸入的二叉樹B的節點個數(節點從1開始計數)。接下來一行有n個數,每個數代表A樹中第i個元素的數值,接下來有n行,第一個數Ki代表第i個節點的子孩子個數,接下來有Ki個樹,代表節點i子孩子節點標號。接下來m+1行,與樹A描述相同。 
    輸出: 
    對應每個測試案例, 
    若B是A的子樹輸出”YES”(不包含引號)。否則,輸出“NO”(不包含引號)。 
    樣例輸入: 
    7 3 
    8 8 7 9 2 4 7 
    2 2 3 
    2 4 5 
    0 
    0 
    2 6 7 
    0 
    0 
    8 9 2 
    2 2 3 
    0 
    0 

    實現
    第一步,在A樹中查找和B樹根節點一樣的值,其實就是樹的前序遍歷,建議遞歸,方便(ps:非遞歸無非就是用個棧存儲結點而已,沒什么技術含量)

  

 /**    * 第一步判斷,遍歷A樹查找是否有等于B樹根結點的子樹    */   int judgeChildTree(struct btree *ahead, int numa, struct btree *bhead, int numb)   {     int flag = 0;        if (numa != -1 && numb != -1) {       if (ahead[numa].value == bhead[numb].value)         flag = doesTree1HasTree2(ahead, numa, bhead, numb);          if (! flag && ahead[numa].lchild != -1)         flag = judgeChildTree(ahead, ahead[numa].lchild, bhead, numb);          if (! flag && ahead[numa].rchild != -1)         flag = judgeChildTree(ahead, ahead[numa].rchild, bhead, numb);     }        return flag;   } 

    第二步,進一步判斷A中以R為根節點的子樹是不是與B樹具有相同的結點

  /**    * 第二步判斷,判斷A樹是否有B樹的子結構    */   int doesTree1HasTree2(struct btree *ahead, int numa, struct btree *bhead, int numb)   {     if (numb == -1)        return 1;     if (numa == -1)       return 0;        if (ahead[numa].value != bhead[numb].value)       return 0;        return (doesTree1HasTree2(ahead, ahead[numa].lchild, bhead, bhead[numb].lchild) &&       doesTree1HasTree2(ahead, ahead[numa].rchild, bhead, bhead[numb].rchild));   } 


完整代碼

   

 #include <stdio.h>   #include <stdlib.h>      // 二叉樹結點定義   struct btree   {     int value;     int lchild, rchild;   };      // A樹和B樹的最多結點數   int n, m;      /**    * 第二步判斷,判斷A樹是否有B樹的子結構    */   int doesTree1HasTree2(struct btree *ahead, int numa, struct btree *bhead, int numb)   {     if (numb == -1)        return 1;     if (numa == -1)       return 0;        if (ahead[numa].value != bhead[numb].value)       return 0;        return (doesTree1HasTree2(ahead, ahead[numa].lchild, bhead, bhead[numb].lchild) &&       doesTree1HasTree2(ahead, ahead[numa].rchild, bhead, bhead[numb].rchild));   }      /**    * 第一步判斷,遍歷A樹查找是否有等于B樹根結點的子樹    */   int judgeChildTree(struct btree *ahead, int numa, struct btree *bhead, int numb)   {     int flag = 0;        if (numa != -1 && numb != -1) {       if (ahead[numa].value == bhead[numb].value)         flag = doesTree1HasTree2(ahead, numa, bhead, numb);          if (! flag && ahead[numa].lchild != -1)         flag = judgeChildTree(ahead, ahead[numa].lchild, bhead, numb);          if (! flag && ahead[numa].rchild != -1)         flag = judgeChildTree(ahead, ahead[numa].rchild, bhead, numb);     }        return flag;   }      int main(void)   {     int i, data, count, left, right, flag;     struct btree *ahead, *bhead;        while (scanf("%d %d", &n, &m) != EOF) {       // 獲取A樹的節點值       ahead = (struct btree *)malloc(sizeof(struct btree) * n);       for (i = 0; i < n; i ++) {         scanf("%d", &data);         ahead[i].value = data;         ahead[i].lchild = ahead[i].rchild = -1;       }          for (i = 0; i < n; i ++) {         scanf("%d", &count);         if (count == 0) {           continue;         } else {           if (count == 1) {             scanf("%d", &left);             ahead[i].lchild = left - 1;           } else {             scanf("%d %d", &left, &right);             ahead[i].lchild = left - 1;             ahead[i].rchild = right - 1;           }         }       }          // 獲取B樹的節點值       bhead = (struct btree *)malloc(sizeof(struct btree) * m);       for (i = 0; i < m; i ++) {         scanf("%d", &data);         bhead[i].value = data;         bhead[i].lchild = bhead[i].rchild = -1;       }          for (i = 0; i < m; i ++) {         scanf("%d", &count);         if (count == 0) {           continue;         } else {           if (count == 1) {             scanf("%d", &left);             bhead[i].lchild = left - 1;           } else {             scanf("%d %d", &left, &right);             bhead[i].lchild = left - 1;             bhead[i].rchild = right - 1;           }         }       }          // 判斷B樹是否為A的子樹       if (n == 0 || m == 0) {         printf("NO/n");         continue;       }          flag = judgeChildTree(ahead, 0, bhead, 0);       if (flag)         printf("YES/n");       else         printf("NO/n");          free(ahead);       free(bhead);     }        return 0;   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品一区二区视频在线观看| 国产999精品视频| 久久亚洲国产精品| 日韩视频在线免费观看| 亚洲国产精品悠悠久久琪琪| 深夜福利91大全| 91精品国产自产在线观看永久| 亚洲色图50p| 中文欧美在线视频| 一区二区三区www| 91极品视频在线| 国产91精品久| 俺也去精品视频在线观看| 日韩欧美aaa| 亚洲人成77777在线观看网| 久热精品视频在线免费观看| 狠狠色噜噜狠狠狠狠97| 日韩精品一区二区视频| 亚洲欧美日韩直播| 欧美日韩加勒比精品一区| 欧美精品少妇videofree| 国产午夜精品免费一区二区三区| 2019亚洲日韩新视频| 亚洲欧洲日韩国产| 韩国视频理论视频久久| 在线成人激情黄色| 欧美自拍大量在线观看| 国产精品啪视频| 色偷偷偷亚洲综合网另类| 另类图片亚洲另类| 国产欧美一区二区三区在线看| 亚洲精品国精品久久99热一| 亚洲第一区中文字幕| 国产免费一区二区三区在线观看| 国产精品va在线| 日韩一二三在线视频播| 久久久久五月天| 91av在线播放视频| 亚洲成人黄色在线观看| 久久精品亚洲94久久精品| 69国产精品成人在线播放| 国产69精品久久久久9| 91精品久久久久久久久久久久久久| 亚洲自拍偷拍区| 色多多国产成人永久免费网站| 国内揄拍国内精品| 国产精品91一区| 久久久久久久国产精品| 国产欧美精品一区二区三区介绍| 国产午夜精品全部视频播放| 深夜福利91大全| www.久久草.com| 曰本色欧美视频在线| 色悠悠久久久久| 午夜精品久久久久久久久久久久| 亚洲性线免费观看视频成熟| 亚洲欧美在线看| 国产又爽又黄的激情精品视频| 日本电影亚洲天堂| 成人网在线视频| 欧美怡红院视频一区二区三区| 成人激情视频小说免费下载| 91在线免费视频| 欧美精品国产精品日韩精品| 在线免费看av不卡| 在线播放精品一区二区三区| 午夜精品久久久久久久99黑人| 欧美日韩在线看| 97视频在线观看视频免费视频| 中文字幕亚洲无线码a| www.亚洲人.com| 亚洲精品美女久久久| 日韩精品视频中文在线观看| 伊是香蕉大人久久| 亚洲国产天堂网精品网站| 久久久久女教师免费一区| 久久久av网站| 亚洲精品一区久久久久久| 国产精品日韩电影| 久久精品视频在线观看| 136fldh精品导航福利| 亚洲精品suv精品一区二区| 精品爽片免费看久久| 一区二区国产精品视频| 日本久久久久亚洲中字幕| 亚洲免费视频在线观看| 亚洲综合成人婷婷小说| 亚洲国产精品视频在线观看| 亚洲一区二区三区777| 国产成人精品综合久久久| 日韩精品久久久久| 欧美成人精品在线视频| 97免费中文视频在线观看| 日韩av不卡电影| 精品偷拍一区二区三区在线看| 91系列在线播放| 亚洲免费高清视频| 久久精品国产91精品亚洲| 亚洲在线观看视频| 超在线视频97| 高清欧美性猛交xxxx黑人猛交| 欧美做受高潮1| 国产精品丝袜久久久久久高清| 久久综合久中文字幕青草| 狠狠综合久久av一区二区小说| 亚洲欧美国产精品va在线观看| 久久久精品一区二区三区| 欧美日韩国产一区二区三区| 亚洲成人黄色在线| 欧美亚洲在线播放| 欧美黑人性猛交| 国产精品久久久久久久久久尿| 亚洲欧美激情在线视频| 欧美大秀在线观看| 亚洲欧洲高清在线| 欧美黑人极品猛少妇色xxxxx| 91视频国产一区| 91精品国产综合久久久久久蜜臀| 久久成人综合视频| 在线播放国产一区二区三区| 久久久久久久久亚洲| 久久精品2019中文字幕| 久久99视频精品| 91wwwcom在线观看| 欧美国产视频一区二区| 亚洲最大av在线| 欧美寡妇偷汉性猛交| 久久久久久久久国产| 日韩欧美成人网| 国产成人免费av| 日韩欧美在线一区| 91成人在线播放| 久久精品国产96久久久香蕉| 久久天天躁狠狠躁夜夜爽蜜月| 久久久久在线观看| 51ⅴ精品国产91久久久久久| 精品久久国产精品| 亚洲xxxx视频| 69**夜色精品国产69乱| 最近中文字幕mv在线一区二区三区四区| 国产中文欧美精品| 国产精品91在线观看| 亚洲伊人成综合成人网| 久久久精品影院| 色偷偷偷亚洲综合网另类| 久久久午夜视频| 亚洲一区二区国产| 亚洲精品色婷婷福利天堂| 成人欧美在线观看| 另类少妇人与禽zozz0性伦| 色诱女教师一区二区三区| 亚洲欧洲国产伦综合| 久久韩国免费视频| 日韩av在线网页| 亚洲91精品在线观看| 中文字幕亚洲欧美在线| 亚洲国产欧美一区二区丝袜黑人| 精品性高朝久久久久久久| 韩国福利视频一区| 欧美成人精品xxx| 国产视频精品一区二区三区| 久久视频免费观看| 欧美夫妻性生活xx| 欧美午夜精品久久久久久久|