<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    靈魂-放水

    為學日益,為道日損。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks

    問題的提出

    ??? 經常會遇到關于二叉樹的算法問題,雖然比較簡單,不過我覺得還是有必要總結一下.順便寫了個sample程序,以供參考.本文中主要討論關于二叉樹的以下3個問題,都是用遞歸來實現,Divide and conquer也就是所謂的分冶策略.
    ??? 1.二叉樹的高度
    ??? 2.二叉樹的寬度
    ??? 3.比較兩個二叉樹是否相等
    此文對應的參考程序可以在 http://shaohui.zheng.googlepages.com/bst.c 下載。

    數據結構的定義

    ??? 先定義一個簡單的二叉樹,由于只是演示,所以定義得比較簡單.

    ?1 #include <stdio.h>
    ?2
    ?3 #define MAX(x,y) ((x)>(y)?(x):(y))
    ?4
    ?5 //define a binary search tree
    ?6 typedef struct BNode
    ?7 {
    ?8 ??? int val;
    ?9 ??? struct BNode *left, *right;
    10 }BNode,*BTree;

    二叉樹節點的值為val,另外為了比較方便還定義了一個宏MAX.

    12 // insert a node to binary tree
    13 // we assume that no duplicated elements
    14 void BTreeInsert(BTree *bt, int val)
    15 {
    16 ??? BNode *p = *bt,*cur = *bt;//p is a parent node of cur
    17 ??? while (cur != NULL)
    18 ??? {//find the position to insert node val
    19 ??????? p = cur;
    20 ??????? if ( val < cur->val )
    21 ??????????? cur = cur->left;
    22 ??????? else
    23 ??????????? cur = cur->right;
    24 ??? }
    25 ??? BNode *n = malloc(sizeof(BNode));
    26 ??? n->val = val;
    27 ??? n->left = n->right = NULL;
    28 ??? if (p == NULL)
    29 ??????? *bt = n;// the tree is empty
    30 ??? else
    31 ??? {
    32 ??????? if (val < p->val)
    33 ??????????? p->left = n;
    34 ??????? else
    35 ??????????? p->right = n;
    36 ??? }
    37 }
    //BTreeInsert
    還定義了一個函數BTreeInsert用來幫助創建二叉樹.

    二叉樹的高度

    基本方法:二叉樹,分別求出左右子數的高度,然后取左右子樹高度的最大數值,再加上1,就是二叉樹的高度.
    由于該問題又被劃分為兩個性質一樣的子問題,因此很容易導致遞歸.

    39 //get the depth of a BST
    40 int BTreeDepth(BTree bt)
    41 {
    42 ??? if (bt != NULL)
    43 ??? {
    44 ??????? int dep_left = BTreeDepth(bt->left);
    45 ??????? int dep_right = BTreeDepth(bt->right);
    46 ??????? return MAX(dep_left,dep_right)+1;
    47 ??? }
    48 ??? return0;
    49 }
    //BTreeDepth

    二叉樹的寬度

    基本方法:左右子樹的寬度相加,于是就得到二叉樹的寬度.
    66 //get the width of a BST
    67 int BTreeWidth(BTree bt)
    68 {
    69 ??? if (bt != NULL)
    70 ??? {
    71 ??????? if ((bt->left == bt->right) && (bt->left == NULL))
    72 ??????????? return1;// bt is a leaf
    73 ??????? else
    74 ??????????? return BTreeWidth(bt->left) + BTreeWidth(bt->right);
    75 ??? }
    76 ??? else
    77 ??????? return0;
    78 }//BTreeWidth
    79

    二叉樹的比較

    ??? 如果我們認為左右子樹位置很重要,也就是說把左右子樹交換以后,我們認為它和原來的子樹不一樣了,那么只需要比較一次就可以了。
    51 //compare 2 binary tree, if bt1 is equal bt2
    52 //return 1, or return 0
    53 int BTreeCompare(BTree bt1, BTree bt2)
    54 {
    55 ??? if ((bt1==bt2) && (bt1==NULL)) // both bt1 and bt2 are empty
    56 ??????? return1;
    57 ??? elseif ((bt1 != NULL) && (bt2 != NULL)) // none of bt1 and bt2 is empty
    58 ??? {
    59 ??????? return BTreeCompare(bt1->left, bt2->left)
    60 ??????????? && BTreeCompare(bt1->right, bt2->right);
    61 ??? }
    62 ??? else// one of bt1 and bt2 is empty
    63 ??????? return0;
    64 }
    ??? 如果我們認為左右子樹位置不重要,也就是說把左右子樹交換以后,我們認為它和原來的子樹還是一樣的,那么我們還好多加判斷.把其中一個子樹左右位置交換以后再比較.那么原來的程序需要有一些改動.

    59-60行需要改成以下內容就可以了。
    59 ??????? return (BTreeCompare(bt1->left, bt2->left) && BTreeCompare(bt1->right, bt2->right))
    60 ??????????? || (BTreeCompare(bt1->left, bt2->right) && BTreeCompare(bt1->right, bt2->left));

    posted on 2006-11-29 19:25 放水老倌 閱讀(353) 評論(0)  編輯  收藏 所屬分類: 讀書筆記
    主站蜘蛛池模板: 国产公开免费人成视频| 免费无码AV一区二区| 久久久国产精品福利免费| 国产小视频免费观看| 亚洲中文无码mv| 亚洲w码欧洲s码免费| 亚洲人成伊人成综合网久久| 国产成人免费高清激情视频| 亚洲成在人线中文字幕| 天天摸夜夜摸成人免费视频| 中国毛片免费观看| 亚洲永久网址在线观看| 亚洲精品在线电影| 亚洲成人激情在线| 亚洲国产精品无码久久SM| 亚洲第一成人影院| 四虎影视精品永久免费| 国产精品冒白浆免费视频| 午夜福利不卡片在线播放免费| 无码国产精品一区二区免费16| 免费看黄的成人APP| 日韩av无码免费播放| 久久免费美女视频| 外国成人网在线观看免费视频 | 国产亚洲视频在线播放大全| 最新亚洲人成网站在线观看| 亚洲人成777在线播放| 亚洲 欧洲 视频 伦小说| 亚洲AV无码专区在线观看成人| 亚洲成a∧人片在线观看无码| 国产成人+综合亚洲+天堂| 国产免费久久精品丫丫| 成人影片一区免费观看| www.黄色免费网站| 破了亲妺妺的处免费视频国产| 四虎国产精品免费视| 久久被窝电影亚洲爽爽爽| 亚洲无mate20pro麻豆| 一个人看的免费高清视频日本| 无码av免费网站| 国产成人免费永久播放视频平台 |