資料結構學習(C++)——樹(總結) (轉)

amyz發表於2007-11-13
資料結構學習(C++)——樹(總結) (轉)[@more@]

才剛開了個頭,就要說再見了——在樹這裡,除了二叉樹,別的都還沒有講。為什麼可以總結了呢?因為前面已經涉及到了樹的兩個基本用途,而如果再講B+、B-,就不能不提到搜尋,如果是勝者樹就不能不提到排序。為此,把這部分放到後面。我前面所做的努力,只是讓你有個基本概念,什麼時候記得用樹。

樹的兩個基本用途,可以用物質和精神來比喻。

一個用途是做為資料儲存,儲存具有樹結構的資料——目錄、族譜等等。為了在實際上是線性的儲存載體上(、)儲存非線性的樹結構,必須有標誌指示出樹的結構。因此,只要能區分根和子樹,樹可以採取各種方法來儲存——多叉連結串列、左子女-右兄弟二叉連結串列、廣義表、多維陣列。由於操作的需求,儲存方法並不是隨意選取的。比如,在並查集的實現上,選取的是雙親連結串列。

一個用途是做為邏輯判斷,此時會常常聽到一個名詞——判定樹。最常用的結構是二叉樹,一個孩子代表true,一個孩子代表false。關於多叉判定樹,有個例子是求8皇后的全部解——這個連高斯都算錯了(一共是92組解,高斯最開始說76組解),我們比不上高斯,但是我們會讓computer代勞。

就像哲學界到現在還糾纏於物質和精神本源問題,實際上在樹這裡也是如此。有些情況下,並不能區分是做為儲存來用還是做為判斷來用,比如搜尋樹,既儲存了資料,還蘊涵著判斷。

和後面的圖相比,樹更基本,也更常用。你可以不知道最短路徑怎麼求,卻每時每刻都在和樹打交道——看看你裡的夾吧。

最後,附帶一個求N皇后的全部解的。

#include

#define N 8

int layout[N];//佈局

int key = 0;

int judge(int row, int col)//判斷能否在(row,col)放下

{

  int i;

  for (i = 0; i < row; i++)

  {

  if (layout[i] == col) return 0;//同一列

  if (i - layout[i] == row - col) return 0;//同一條主對角線

  if (i + layout[i] == row + col) return 0;//同一條副對角線

  }

  return 1;

}

void lay(int row)//在row行上放Queen

{

  int i;

  if (row == N)//放完N個Queen輸出佈局

  {

    printf("n%02d ", ++key);

    for (i = 0; i < N; i++) printf("%c%d ", layout[i] + 'a', i + 1);

  }

  else

  {

    for (i = 0; i < N; i++)//在i列上放Queen

  {

    layout[row] = i;

    if (judge(row, i)) lay(row + 1);

  }

  }

}

 :namespace prefix = o ns = "urn:schemas--com::office" />

int main()

{

  lay(0);

  return 0;

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982143/,如需轉載,請註明出處,否則將追究法律責任。

相關文章