資料結構學習記錄 中序情況下線索二叉樹的構建

2021-08-17 14:43:22 字數 1516 閱讀 4210

先規定線索二叉樹結點結構如下

struct threadnodethreadnode,*threadtree;
ltag=0 表示lchild指向左孩子

ltag=1 表示lchild指向前驅

rtag=0 表示rchild指向右孩子

rtag=1 表示rchild指向後繼

注意:第一號結點前驅為null,最後一號結點後繼為null,其餘葉節點lr指標都指向前驅或後繼,只要是結點lr指標都有指向(要麼前驅後繼,要麼孩子)

當乙個二叉樹p由線索節點構成但又尚未線索化時,如何操作才能將p線索化?下面進行分析:

首先對二叉樹線索化肯定要遍歷一次二叉樹,分析每個結點並對應的修改其指標指向行程線索流。用中序遍歷來討論,前序和後續還沒思考過……

一、將【遍歷順序的實現】和【對結點的具體操作】分割開分別來看

只要函式的結構滿足形式↓

void preorder(bitree t)

}

就能保證處理結點的順序是按照中序來的,這樣在對結點進行具體操作時作時就只用考慮怎麼操作能達到目標要求(樣式形狀anyway……)而不用再管是不是要進到下乙個結點順序對不對(??)。起到遍歷順序和具體操作隔離開的效果。

二、對節點的具體操作

樹中的結點狀態各不相同(有兩個孩子/有左/有右/無孩子),相對應的操作也就不同。

提出兩種解決思路:一種是判別結點種類(是上述四種中哪一種)(僅猜想,還沒思考過可行性……)

二是不管什麼型別,對每乙個結點都將所有需要的操作都做

採取法二,抽象出每個結點需要做的操作:

① 檢查當前結點lchild是否為空 → 滿,則說明有左孩子不用(也不能)構建前驅,【不操作】

→ 空,【構建前驅,p->lchild=pre ; ltag=1】

②檢查當前結點的上一結點rchild是否為空→滿,則說明有右孩子不用(也不能)構建後繼,【不操作】

→空,則將上一結點rchild指向當前結點使當前結點成為其後繼(此時pre是插在上一結點)

【pre->rchild=p; rtag=1】

③左右都檢查完後將原本插在上一結點的pre更新到當前結點

做完此步後本層(本結點)操作才算完,可以進入下一號結點。

(注意:對每乙個結點來說都要進行這三步操作,但檢查rchild指標的操作不是在當前這一層做的,是在進到下乙個結點的時候又返回來檢查的。)

下列是完整**

void inthread(thredtree &p,threadtree &pre)

if(pre!=null&&pre->rchild==null)

pre=p;

inthread(p->rchild,pre);

}}

void creatinthread(threadtree t)

}

小白第一次寫部落格,請大佬糾錯的時候溫柔一點

9 14資料結構學習記錄

include include includeusing namespace std int main sqstack sqstack st int initstack sqstack st 初始化棧 int empty sqstack st int push sqstack st,int x in...

資料結構學習記錄(一)

因為學資料結構比較頭大 我們學的是c資料結構,而我早已經把c忘光了 看書也有點難懂,所以去leetcode刷題了。今天開始刷題記錄 因為我實在是不想把這麼多東西存到電腦,那麼乾脆雲乙份吧 這些記錄都比較個人,是做給自己看的。給定乙個整數型別的陣列 nums,請編寫乙個能夠返回陣列 中心索引 的方法。...

資料結構學習記錄 1

1.資料結構是相互之間存在一種或對多種特定關係的資料元素的集合。2.在任何問題中,資料元素都不是孤立存在的,而是在他們之間存在著某種關係,這種資料元素之間的關係叫做結構 3.根據資料元素之間關係的不同特性,通常有4類基本結構 a.集合 結構中的資料元素之間除了 同屬於用乙個集合 的關係外,沒有其他關...