學習不停
線索二叉樹:普通二叉樹只能找到結點的左右孩子資訊,而該結點的直接前驅和直接後繼只能在遍歷過程中獲得若將遍歷後對應的有關前驅和後繼預存起來,則從第乙個結點開始就能很快「順藤摸瓜」而遍歷整個樹。
總結起來線索二叉樹其實就是利用節點空指標來指向前驅節點或後繼節點。總的來說能根據任一節點遍歷整棵樹。
1)若結點有左子樹,則lchild指向其左孩子;
否則, lchild指向其直接前驅(即線索);
2)若結點有右子樹,則rchild指向其右孩子;
否則, rchild指向其直接後繼(即線索) 。
為了避免混淆,每個節點增加兩個標誌域
ltag :若 ltag=0, lchild域指向左孩子;
若 ltag=1, lchild域指向其前驅。
rtag :若 rtag=0, rchild域指向右孩子;
若 rtag=1, rchild域指向其後繼。
下圖為二叉樹中序遍歷,
節點b,無左孩子(lchild為空),ltag標記為1,lchild指向a,
節點c,無左右孩子(lchild、rchild為空),ltag與rtage標記為1,lchild指向b,rchild指向後繼,此處後繼無節點,則回到開始,可以是a,也可以加乙個頭節點(root)。
節點d,無右孩子(rchild為空),rtag標記為1,rchild指向a或(root)。
節點e,無左右孩子(lchild、rchild為空),ltag與rtage標記為1,lchild指向a,rchild指向前驅d。
這裡重點講下中序,其它序列只是順序不同,線索原理是一樣的的。
線索:指向結點前驅和後繼的指標
線索鍊錶:加上線索二叉鍊錶
線索二叉樹:加上線索的二叉樹(圖形式樣)
線索化:對二叉樹以某種次序遍歷使其變為線索二叉樹的過程
注:此圖中序遍歷結果為: h, d, i, b, e, a, f, c, g
// 定義線索二叉樹型別
typedef
struct tree tree,
*trees;
trees pre =
null
;// 全域性指標
// 初始化二叉樹,只有乙個根節點,無左右孩子
void
initbitree
(trees *root)
// 建立二叉樹
void
createbitree
(trees &root)
}// 新增線索
void
insertlinetree
(trees &root)
if(pre !=
null
&& pre-
>rchild ==
null
)// 當前訪問節點為下乙個訪問節點的前驅
pre = root;
// 線索公右子樹
insertlinetree
(root-
>rchild);}
}// 建立頭結點
trees inorderthread
(trees &rt)
throot-
>ltag =0;
// 等於0 指向左孩子 1
throot-
>rtag =1;
// 等於1 指向遍歷的前驅 2
throot-
>rchild = throot;
// 右迴指標,指向自己(頭結點) 3if(
!throot)
throot-
>lchild = throot;
// 如二叉樹為空,建立左回指標(也就是指向頭結點)
else
return throot;
}// 中序遍歷查詢前驅
void
inpre
(trees root)
if(pre)
printf
("中序遍歷找到前驅為:%d\n"
, pre-
>data)
;else
printf
("中序遍歷無前驅.\n");
}// 中序遍歷查詢後繼
void
innext
(trees root)
if(pre)
printf
("中序遍歷查詢到後繼為:%d\n"
,pre-
>data)
;else
printf
("中序遍歷無後繼.\n");
}// 中序遍歷查詢線索二叉樹上的第一結點
trees infirst
(trees root)
// 中序遍歷線索二叉樹
線索化二叉樹以及遍歷線索化二叉樹
1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...
線索化二叉樹
define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...
線索化二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...