線索二叉樹:對二叉樹以某種次序遍歷得到序列中的前驅和後繼,其中指向結點前驅和後繼的指標稱為線索,再加上線索的二叉樹稱之為線索二叉樹。
線索化:對二叉樹以某種次序遍歷使其變成線索二叉樹的過程稱為線索化
注意:線索化是要基於一棵二叉樹上線索化,所以我們要先建樹!
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 ...