#include
#include
#include
using namespace std;
#define num 100
#define busy 0
#define rest 1
#pragma warning(disable:4996)
typedef
struct node
*tnode, tnode;
void
createhead
(tnode &p)
;//初始化表頭
void
createtree
(tnode &tree)
;//建立二叉樹
void
endnode
(tnode &t, tnode &t)
;//求出二叉樹最後乙個結點
void
linktree
(tnode tree,tnode &p)
;//線索化二叉樹
/*關於線索化二叉樹函式中tree和p的關係:以p的視角來看p永遠是tree的前驅,tree永遠是p的後繼,所以在p的右孩子為空或者tree的左孩
子為空時,讓p->rchild=tree,tree->lchild=p,用這樣的方式以中序遍歷的方式依次為每個節點尋找它的前驅和後繼,以此完成二叉樹的線
索化*/
void
printtree
(tnode head)
;//遍歷線索二叉樹(非遞迴)
intmain()
void
createhead
(tnode &p)
//初始化表頭
void
createtree
(tnode &tree)
//建立二叉樹
}void
endnode
(tnode &t,tnode &t)
//求出二叉樹中序遍歷最後乙個結點,並讓最後乙個結點的右孩子指向表頭
void
linktree
(tnode tree,tnode &p)
//線索化二叉樹
if(p->rchild ==
null
)//在產生後繼後,用p代替剛才的"當前節點",來給當前節點尋找後繼(在p->rchild == null)
p = tree;
linktree
(tree->rchild,p);}
}void
printtree
(tnode head)
//遍歷線索二叉樹(非遞迴)
cout
while
(p->rcount == rest && p->rchild != head)
p = p->rchild;
//進入子樹的右子樹
}}
這是演示示例的邏輯結構圖,在本例中以編譯器輸入#為結束符號,即表示指向空
上圖中藍色連線線是未線索化之前的邏輯結構,加上橙色連線線後是線索化過程中進行的結點前驅後繼的連線結果
所以在編譯器中的輸入應為:abc##de##f##g#hi###
下圖是對應**的執行結果
【注】:線索二叉樹的好處就是在需要多次遍歷二叉樹或者尋找二叉樹相應結點的前驅後繼時,利用這種邏輯結構可以在遍歷時不採用遞迴策略,從而減少對堆記憶體的消耗並且可以快速得出每個結點的前驅後繼
線索二叉樹的建立和遍歷
基本概念 對於n個結點的二叉樹,在二叉鏈儲存結構中有n 1個空鏈域,利用這些空鏈域存放在某種遍歷次序下該結點的前驅結點和後繼結點的指標,這些指標稱為線索,加上線索的二叉樹稱為線索二叉樹,這種加上了線索的二叉鍊錶稱為線索鍊錶。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹 中序線索二叉樹和後序線索...
資料結構 線索二叉樹(中序線索二叉樹及遍歷)
二叉樹的遍歷是按照一定的規則把二叉樹中的節點按照一定的次序排列成線性序列進行訪問的,實質上就是對乙個非線性結構進行線索化操作,使得每個節點 除第乙個和最後乙個外 都有前驅 和後繼節點,有時為了運算方便需要記錄這些前驅和後繼節點,稱為二叉樹線索化,而對於不同的遍歷規則,又分為先序線索二叉樹,中序線索二...
線索二叉樹 資料結構
按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...