<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)  編輯  收藏 所屬分類: 讀書筆記
    主站蜘蛛池模板: 国产精品九九久久免费视频 | 久久亚洲春色中文字幕久久久| 2022国内精品免费福利视频 | 久久国产免费观看精品3| 亚洲国产精品高清久久久| 97国免费在线视频| 亚洲国产成人片在线观看| 黄色免费在线网站| 久久精品国产亚洲AV香蕉| 麻豆视频免费播放| 日本亚洲色大成网站www久久| 免费的涩涩视频在线播放| 亚洲人成色777777老人头| 国产色婷婷精品免费视频| 日韩一级片免费观看| 国产亚洲精品线观看动态图| 国产情侣久久久久aⅴ免费| 亚洲精选在线观看| 国产成人免费午夜在线观看| 亚洲中文字幕在线无码一区二区| 久久精品a一国产成人免费网站| 亚洲色大18成人网站WWW在线播放| 日本免费人成视频播放| 国产免费福利体检区久久| 亚洲人成影院在线| 青青青国产在线观看免费网站| 亚洲国产成人无码AV在线影院| 四虎永久免费影院在线| 两性色午夜视频免费网| 亚洲欧洲综合在线| 又粗又硬免费毛片| 久久这里只精品99re免费| 亚洲AV成人一区二区三区在线看| 免费国产怡红院在线观看| 一区二区三区在线免费看| 亚洲无码一区二区三区| 亚洲乱码精品久久久久..| 日韩吃奶摸下AA片免费观看| 国产男女爽爽爽免费视频| 亚洲av无码国产综合专区| 亚洲一区无码精品色|