樹的定義及基本操作

2021-09-30 15:04:47 字數 1796 閱讀 8792

首先,什麼是樹呢?

數的定義是遞迴的:

定義樹是滿足以下條件的,包含至少乙個結點的有限集合:

(1)樹中有乙個特別指定的結點,稱為根,或樹根。

(2)其它結點劃分成n>=0個不相交的集合t1…tn ,每個集合又還是一棵樹,但稱為根的子樹。

樹的主要操作包括:求樹的深度、求給定節點的子節點、兄弟節點、遍歷樹、插入子樹、刪除子樹等等。因為樹的定義本身就是遞迴的,所以在實際的程式中,很多操作也是通過遞迴來完成的。

樹是如何表示的呢?有一種常用的表示方法,成為孩子、兄弟表示法,對於每個節點,通過孩子指標指向自己的子節點,通過兄弟指標指向自己右邊的兄弟。

typedef char elemtype;

//通過第乙個孩子和下乙個兄弟來確定整個樹

typedef struct tnode

tnode,*tree;

//初始化乙個節點

tree inittree(elemtype e)

//刪除樹

void deletetree(tree *t)

//遍歷樹並列印

void printtree(tree t)

*///注釋掉的部分等價於如下兩行:

printtree(t->firstchild);

printtree(t->nextsibling); }}

//求樹的高度:有錯誤

int treedepth(tree t)

return hmax+1; }

//全域性變數記錄找到的元素的位址

tree result;

void locateelem(tree t,elemtype e)

*/ locateelem(t->firstchild,e);

locateelem(t->nextsibling,e);

}//返回子節點的指標

tree findchild(tree t,elemtype e)

//返回兄弟節點的指標

tree findsibling(tree t,elemtype e)

//插入子樹

bool inserttree(tree t,tree tadd,elemtype e)

else

return false; }

//刪除子樹

bool deletesubtree(tree t,elemtype e)

else

return false;

}

初始化節點時要注意,這裡通過函式的返回值將動態分配的節點帶出去了,但是並沒有說明節點之間的關係,所以需要在主函式中手動的為每個節點連線它的孩子和兄弟指標。對於樹的核心操作,毫無疑問是如何遞迴的遍歷一棵樹。我們的作法是這樣的:對於乙個節點,先訪問它的資料域,然後通過孩子指標來訪問它的孩子,一直到沿著這條分支的葉子節點,此時,訪問這個節點的兄弟,直到所有的兄弟都訪問過了,然後回退到上一節點,訪問它的兄弟,依次類推。

在程式中,有兩種寫法,以printtree為例,注釋掉的部分更貼近於我們描述,而實際使用的**則更加抽象、簡潔。按理來說,二者是可以相互轉化的,但是對於在求樹的高度這一塊,我並沒有好的辦法解決。

對於通過遞迴操作操作的產找,有乙個很煩人的問題,就是找到以後如何把指向這個節點的指標帶出來。我試了很多方法,都不管用,無奈之下使用了全域性變數。所以每次進行跟查詢有關的操作時(查詢、指定位置插入、指定位置刪除),都必須先初始化result指標為null。如果讀者有更好的辦法,歡迎指教。

這裡並沒有給出通過乙個節點來查詢到它的父節點的操作,雖然這個工作「可能」可以完成,但最簡單明瞭的辦法就是在結構體內部增加乙個指向parent的指標。

樹的定義及基本操作

首先,什麼是樹呢?數的定義是遞迴的 定義樹是滿足以下條件的,包含至少乙個結點的有限集合 1 樹中有乙個特別指定的結點,稱為根,或樹根。2 其它結點劃分成n 0個不相交的集合t1 tn 每個集合又還是一棵樹,但稱為根的子樹。樹的主要操作包括 求樹的深度 求給定節點的子節點 兄弟節點 遍歷樹 插入子樹 ...

棧的定義及基本操作

1 定義 棧是僅限定在表的一端操作的線性表 2 性質 先進後出 後進先出 3 棧的儲存方式 順序儲存和鏈式儲存 順序棧的型別定義 typedef struct stack 棧的壓入操作 1 首先判斷是否棧滿,若棧滿,則輸出 棧滿溢位 2 先指標top 棧元素值 push s,e return s 棧...

佇列的定義及基本操作

1.佇列是一種先進先出的線性表,它的操作只能在表的兩端進行 2.分類 鏈佇列 鏈式表示 迴圈佇列 順序表示 結點結構 typedef struct qnodeqnode,qptr 鏈佇列結構 typedef struct linkqueue 建立空佇列 status initqueue linkqu...