acm第十九次樹

                         一、樹及二叉樹

1、樹的概念----樹的定義
一棵樹是由n(n>0)個元素組成的有限集合,其中:
①每個元素稱爲結點(node);
②有一個特定的結點,稱爲根結點或樹根(root);
③除根結點外,其餘結點能分成m(m>=0)個互不相交的有限集合T0,T1,T2,……Tm-1。其中的每個子集又都是一棵樹,這些集合稱爲這棵樹的子樹。
2、數的基本概念
①一個結點的子樹個數,稱爲這個結點的度;度爲0的結點稱爲葉結點;度不爲0的結點稱爲分支結點;根以外的分支結點又稱爲內部結點;樹中各結點的度的最大值稱爲這棵樹的度;
②在用圖形表示的樹型結構中,對兩個用線段(稱爲樹枝)連接的相關聯的結點,稱上端結點爲下端結點的父結點,稱下端結點爲上端結點的子結點。
④稱同一個父結點的多個子結點爲兄弟結點。
⑤稱從根結點到某個子結點所經過的所有結點爲這個子結點的祖先。
⑥稱以某個結點爲根的子樹中的任一結點都是該結點的子孫。
⑦定義一棵樹的根結點的層次爲1,其它結點的層次等於它的父結點層次加1。一棵樹中所有的結點的層次的最大值稱爲樹的深度
⑧對於樹中任意兩個不同的結點,如果從一個結點出發,自上而下沿着樹中連着結點的線段能到達另一結點,稱它們之間存在着一條路徑。可用路徑所經過的結點序列表示路徑,路徑的長度等於路徑上的結點個數減1。
⑨森林是棵互不相交的樹的集合。
3、數的存儲結構
①方法1:數組,稱爲“父親表示法”。
  const int m = 10; //樹的結點數
  struct node
  {
   int data, parent; //數據域,指針域
  };
  node tree[m];
優缺點:利用了樹中除根結點外每個結點都有唯一的父結點這個性質。很容易找到樹根,但找孩子時需要遍歷整個線性表。
②方法2:樹型單鏈表結構,稱爲“孩子表示法”。每個結點包括一個數據域和一個指針域(指向若干子結點)。假設樹的度爲10,樹的結點僅存放字符,則這棵樹的數據結構定義如下:
const int m = 10; //樹的度
typedef struct node;
typedef node *tree;
struct node
{
char data; //數據域
tree child[m]; //指針域,指向若干孩子結點
};
tree t;
缺陷:只能從根(父)結點遍歷到子結點,不能從某個子結點返回到它的父結點。
③方法3:樹型雙鏈表結構,稱爲“父親孩子表示法”。每個結點包括一個數據域和二個指針域(一個指向若干子結點,一個指向父結點)。假設樹的度爲10,樹的結點僅存放字符,則這棵樹的數據結構定義如下:
const int m = 10; //樹的度
typedef struct node;
typedef node *tree; //聲明tree是指向node的指針類型
struct node
{
char data; //數據域
tree child[m]; //指針域,指向若干孩子結點
tree father; //指針域,指向父親結點
};
tree t;
④方法4:二叉樹型表示法,稱爲“孩子兄弟表示法”。也是一種雙鏈表結構,但每個結點包括一個數據域和二個指針域(一個指向該結點的第一個孩子結點,一個指向該結點的下一個兄弟結點)。
  typedef struct node;
  typedef node *tree;
  struct node
  {
   char data; //數據域
   tree firstchild, next; //指針域,分別指向第一個孩子結點和下一個兄弟結點
  };
  tree t;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章