唐老師資料結構專題八3

2021-06-19 07:48:28 字數 1830 閱讀 7081

關於二叉樹的建立:

這裡有個問題,就是二叉樹,就不能想1中講的那樣,建立兩個鍊錶,乙個孩子鍊錶,乙個組織鍊錶,因為二叉樹的孩子是分左右的,這個順序不能搞混,所以就直接是在每個二叉樹的結點中設定兩個指標,分別指向左右孩子,這樣就可以了,但是又有乙個問題隨之而來,那就是如何定位??這個問題唐老師給了乙個很形象的解決辦法,「指路」就是說,當你到了陌生的地方,別人給你指路,然後你會按照指的路去一步一步走,同樣的,在想二叉樹裡插入元素的時候,自己可以設定乙個路標,然後按照路標的指示一直走下去即可。

然後是二叉樹的插入, 這個函式還要有乙個特殊的引數,就是當你插入某個結點元素n後,該樹可能是插在某個結點m的後面,而m的後面原先也有元素,當你插入後,原先的那些元素樹時放在你插入的元素n的做樹後面,還是右樹後面呢,這個就需要這個特殊的引數了。

然後是二叉樹的遍歷:分為前序遍歷,中序遍歷,後序遍歷還有層次遍歷。

現在先展示一下插入函式,如何通過用指示來尋找這個函式的:

//左邊的孩子 

#define child_l 0

//右邊的孩子

#define child_r 1

//這個是指向樹的根節點的頭

//包含著指向二叉樹的根的指標,和該二叉樹的結點數目

typedef struct _tag_btreelist btreelist;

struct _tag_btreelist

;

插入元素函式如下:

//這裡node是資料元素  pos則是路標,按照路標就可以找到 count則是計數

//這裡可能有人會問,都有指標了為什麼還用count呢 比如pos=0x00 你的意思是插在根節點的左邊

//如果沒有count 你怎麼判斷你這個pos已經移動完了呢 所以有必要加個count

//flag則是將插入結點後面的元素插在該元素的左邊還是右邊

int tree_insert(btree* tree, btreenode* node, btpos pos, int count, int flag)

else if( p = child_r )

count--;

} if( parents != null )

else if( p == child_r )

}//如果兩個都不是 那麼插入的應該是樹的根

else

//將插入結點後面的元素 連線到新的節點處

if( flag == child_l )

else if( flag == child_r )

btree->count++; }

return ret;

}

刪除函式:(這裡主要注意的是count沒刪除乙個元素的時候,可能count減小的值並不是1  因為刪除的元素後面可能還會有元素)

btreenode* tree_delete(btree* tree, btpos pos, int count)

else if( p = child_r )

count--;

} if(parents != null)

else if( p == child_r )

}//刪除的的根節點

else

//這裡不要忘了count減小的值不是1 因為刪除的元素他的後面可能還會有元素

btree->count = btree->count - recursive_count(current);

ret = current; }

return ret;

}

唐老師資料結構專題八2

前面已經說到,二叉樹使用及其廣泛,現在就來說一下 在這裡先進行宣告 這裡所有樹的結點完全沒有指向父親結點的指標,唐老師沒有指名原因,但是他後面的一句話,感覺應該是他的原因,那就是做出二叉樹,也是為了節省空間,所以就沒有在樹節點裡包含指向父親結點的指標。首先是二叉樹的定義 二叉樹是由 n 個結點組成的...

唐老師 資料結構 專題五

這個專題講的內容是遞迴,並且這節的 量都不是很大,關鍵就是遞迴的思想,對於可以用遞迴去完成的任務,應該運用整體的思想,不用把每一步都想得很清楚,並且一定要有最後的結束判斷 對 還有個重要內容就是唐老師講到了計算機在函式與函式呼叫的時候,要利用棧,而這個棧是類似於我們之前用到的順序棧,就是一開始就已經...

唐老師資料結構 專題四的筆記

首先是寫棧的習慣 一定要在建立完棧後 就立即寫上銷毀棧的函式 否則很容易遺忘銷毀 導致記憶體洩露 在唐老師講的符號配對檢測的程式時 有乙個小細節 老師並沒有提出來 但是後來發現了 char c char linkstack pop stack 進行檢測 格外注意 一定要先c null if c nu...