C語言資料結構之線索二叉樹

2021-10-23 23:16:28 字數 2563 閱讀 1244

線索二叉樹:對二叉樹以某種次序遍歷得到序列中的前驅和後繼,其中指向結點前驅和後繼的指標稱為線索,再加上線索的二叉樹稱之為線索二叉樹。

線索化:對二叉樹以某種次序遍歷使其變成線索二叉樹的過程稱為線索化

注意:線索化是要基於一棵二叉樹上線索化,所以我們要先建樹!

1、線索二叉樹的儲存結構

lchild

ltag

data

rtag

rchild

其中,標誌域的含義:

ltag

rtag

對應的線索二叉樹結構體:

typedef

struct node

node,

*pnode;

相比普通的二叉樹,線索二叉樹多了標誌域,標誌域的值及其含義如上。

2、中序線索二叉樹的構建

思路:這裡可以用乙個輔助指標pre,來記錄遞迴時正在訪問的結點的前驅結點。

在中序遍歷時,若當前正在訪問的結點左指標為空,就將其左指標指向pre;

若pre的右指標為空,則將其右指標指向當前結點;

注意,這裡我們要在子函式修改在主函式宣告的tree和pre的值,所以這裡我們在子函式中傳入tree和pre的位址!

具體實現:

//二叉樹的中序線索化,引數是當前結點及前趨結點

//二叉樹的中序線索化,引數是根結點及前趨結點

void

inthread

(pnode *tree,pnode *pre)if(

*pre !=

null&&(

*pre)

->right ==

null

)//右子樹為空,則由pre將右指標線索化(這裡是返回上一層,現在的根結點就變成了上一層的還未線索化的右指標的後繼)(右指標線索化)

*pre =

(*tree)

;//pre跟著tree走,記錄tree的中序前趨結點

inthread(&

((*tree)

->right)

,pre)

;//中序遍歷先找到最右側的子樹}}

//建立中序線索化二叉樹

void

createinthread

(pnode *tree)

}

3、中序線索二叉樹的遍歷思路:

具體實現:

//中序線索二叉樹的遍歷

pnode firstnode

(pnode tree)

//找中序線索化開始的結點(最左側的結點)

pnode nextnode

(pnode p)

//找中序線索化條件下,p結點的後繼結點

void

inorder

(pnode tree)

//遍歷中序線索二叉樹

至此,中序線索二叉樹的建立以及遍歷已經完成。我們在main()函式中測試一下:

int

main()

; pnode p[n]

;//樹的結點

pnode tree;

//根結點

initbitree

(p, c)

;//初始化樹

createbitree

(p);

//層次建樹

tree = p[1]

;//1號結點作為根結點

printf

("二叉樹的中序遍歷:");

midorder

(tree)

;printf

("\n");

//將二叉樹中序線索化

createinthread

(&tree)

;//建立中序線索二叉樹

printf

("---------------------------------------\n");

printf

("tree->c=%c\n"

, tree->c)

;printf

("---------------------------------------\n");

printf

("中序線索二叉樹遍歷:");

inorder

(tree)

;//遍歷中序線索二叉樹

printf

("\n");

return0;

}

測試結果:

可以看到二叉樹的中序遍歷結果與中序線索二叉樹遍歷結果相同!

tips:人生就像賽跑,不在乎你是否第乙個到達終點,而在乎你有沒有跑完全程。

資料結構之線索二叉樹

應用案例說明 將下面的二叉樹,進行中序線索二叉樹。中序遍歷的數列為 定義threadedbinarytree 實現了線索化功能的二叉樹 class threadedbinarytree 過載一把threadednodes方法 public void threadednodes 遍歷線索化二叉樹的方法...

資料結構之 線索二叉樹

2 線索二叉樹 實現 對於一顆二叉樹而言 如下圖所示 每次我們想要查詢二叉樹裡面的乙個節點的時候,我們都必須遍歷這棵樹,以中序遍歷為例,遍歷的順序為4251637,當我們遍歷到標號為5這個節點的時候,如果有個指標指向5的前乙個節點2或者後乙個節點1的話,那麼我們跳轉到2或者1的效率肯定會大大的提公升...

線索二叉樹 資料結構

按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...