<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)  編輯  收藏 所屬分類: 讀書筆記
    主站蜘蛛池模板: 免费观看四虎精品成人| 久久国产福利免费| MM1313亚洲国产精品| 免费的黄色的网站| 免费真实播放国产乱子伦| 亚洲日本va午夜中文字幕久久| 亚洲AV香蕉一区区二区三区| 永久免费av无码网站yy| 精品亚洲一区二区| 一级毛片在线免费看| 在线看片无码永久免费aⅴ| 亚洲av乱码一区二区三区按摩| 日韩精品视频免费观看| 久久精品国产亚洲AV天海翼| 在线a亚洲v天堂网2018| 亚洲精品高清国产麻豆专区| 羞羞视频在线免费观看| 超清首页国产亚洲丝袜| 亚洲色大成WWW亚洲女子| 在线观看免费亚洲| 精品一区二区三区高清免费观看| 亚洲欧洲无码AV电影在线观看| 日本视频在线观看永久免费| 国产乱子伦精品免费女| 72pao国产成视频永久免费| 亚洲国产精品嫩草影院在线观看| 91精品国产免费入口| 亚洲中文字幕无码爆乳| 亚洲国产天堂久久综合| 小草在线看片免费人成视久网| 激情亚洲一区国产精品| 又大又黄又粗又爽的免费视频 | 免费观看黄网站在线播放| 亚洲人成网站在线在线观看| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲免费黄色网址| 亚洲6080yy久久无码产自国产 | a毛片免费观看完整| 亚洲国产香蕉人人爽成AV片久久| 免费播放在线日本感人片| 7777久久亚洲中文字幕|