從資料結構中樹的定義可知,除根結點外,樹中的每個結點都有唯一的乙個雙親結點。根據這一特性,可用一組連續的儲存空間(一維陣列)儲存樹中的各結點。樹中的結點除儲存結點本身的資訊之外,還要儲存其雙親結點在陣列中的位置(即在陣列中的下標。雙親的資訊為-1則表示該結點為根結點),樹的這種表示法稱為雙親表示法。
樹的每個結點的資料型別定義如下:
struct ptnode
char data; //結點資料域
int parent; //結點雙親在陣列中的位置
樹的資料型別定義如下:
#define max_tree_size 100
struct ptree
struct ptnode nodes[max_tree_size]; //儲存樹中所有結點
int n; //樹中共有n個結點,n不超過100
則下圖1所示的樹,按照雙親表示法儲存結構,儲存為圖2所示形式(n為10)。
已知一棵樹已儲存為以上形式,請編寫函式getcount,計算指定結點的兄弟結點(包括自己)數目。getcount的函式原型為:
int getcount(struct ptree t, char nodedata)
函式形參
t:儲存了樹中結點數目及圖2所示的結點陣列
nodedata:查詢nodedata有幾個兄弟。比如圖1的樹,如果nodedata為』e』,則其兄弟結點總數目為3。如果nodedata為』h』,則其兄弟結點總數目為1。如果nodedata不存在,其兄弟結點數為0。
函式返回值:
nodedata兄弟結點的數目。
以下提供了部分**,其中struct ptree createtree()函式用於從鍵盤輸入樹的雙親表示法的資訊,建立一棵樹。輸入的第乙個數n表示樹中結點數,此後有n行輸入,每行表示乙個結點的資訊,第乙個資訊為結點的資料,第二個資訊為結點的雙親結點在陣列中的位置。
請完成getcount函式。
#include
#define max_tree_size 100
struct ptnode /*樹的乙個結點*/
char data;
int parent; /* 雙親位置域 */
struct ptree
struct ptnode nodes[max_tree_size];
int n; /* 結點數 */
int getcount(struct ptree t, char nodedata)
/*請編寫函式體*/
struct ptree createtree()
int i,n;
int parentid;
char ch;
struct ptree newtree;
scanf("%d", &n);
newtree.n=n;
for (i = 0; i < n; i++)
scanf(" %c%d", &ch, &parentid);
newtree.nodes[i].data=ch;
newtree.nodes[i].parent=parentid;
return newtree;
int main()
struct ptree atree;
int count;
char searchdata;
atree = createtree();
scanf(" %c", &searchdata);
count=getcount(atree,searchdata);
printf("%d\n", count);
return 0;
第一行輸入乙個整數n,表示樹的結點總數。
以下n行,每行為乙個結點的資訊,包括兩部分:結點資料(乙個字元)以及雙親結點的位置下標(下標從0開始)。
最後一行為乙個字元,表示需要查詢兄弟結點數目的結點資訊。
輸出計算出的兄弟結點的數目
10a -1
b 0c 0
d 0e 1
f 1g 1
h 2i 3
j 3e
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define max_tree_size 100
struct ptnode /*樹的乙個結點*/
;struct ptree
;int getcount(struct ptree t, char nodedata)
for (i = 0; i < t.n; i++)
return cnt;
}struct ptree createtree()
return newtree;
}int main()
Trie樹兄弟單詞例項
如果乙個單詞,將其字母順序重新排列可以生成另乙個單詞,則稱這兩個單詞是兄弟單詞。如 mary army cinema iceman 現在給定乙個字典,使用者輸入乙個單詞,如何根據字典找出這個單詞有哪些兄弟單詞?要求時間和空間效率盡可能的高。利用trie樹就可以妥善解決。只需將上面的樹節點增加乙個ve...
5 4 搜尋樹判斷 25分
5 4 搜尋樹判斷 25分 對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序...
樹和森林的孩子兄弟結構
linux核心中多處用到孩子兄弟結構來組織一些相同型別的資料。如task struct,dentry,vfs mount等,結構圖如下 實現原理很簡單,主要有三個字段 parent 指向父結構的指標 children 子結構鍊錶的頭 sibling 將自己連線到父節點的子結構鍊錶中。結構定義如下 t...