二叉樹的線索化 線索二叉樹的遍歷(中序)

2021-10-01 04:16:29 字數 2191 閱讀 8520

二叉樹的線索化:對於n個節點的二叉樹,在二叉儲存鍊錶中有n+1個空鏈域,利用這些空鏈域存放某種遍歷次序下的指向該節點的前驅和後繼的指標,這些指標成為線索,被線索的二叉樹成為線索二叉樹。這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹(threaded binarytree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

中序線索二叉樹:指在中序遍歷的同時,對二叉樹進行線索化,只需要在原先的中序遍歷中新增相應的線索話語句即可,設定兩個指標,p和pre,p指向當前訪問的節點,pre指向上乙個訪問的節點,修改指標:如果p->lchnull,則p->lch=pre,p->ltag=1;如果pre->rchnull,則pre->rch=p,pre->rtag=1。隨著p和pre的不斷更新,即可完成線索化過程

void

inorder

(node *now)

//中序遞迴將二叉樹進行線索化

if(pre!=

null

&&pre->rch==

null

) pre=now;

/*********/

inorder

(now->rch);}

return

;}

如果乙個節點的左孩子為空,我們讓這個lch指標指向指向該節點的前驅,如果該節點的右孩子為空,則將rch指標指向該節點的後繼,此時,我們需要增加兩個標記,表明指標是指向孩子的還是指向前驅或者後繼。

ltag:為0,表示lch指向左孩子;為1,表示lch指向前驅節點

rtag:為0,表示rch指向左孩子;為1,表示rch指向後繼節點

線索化之後,該如何遍歷呢?以中序遍歷為例,遍歷分為兩個步驟:

1.訪問遍歷的第乙個節點,位於樹中最「左下端的節點」,從根節點沿著左孩子指標,找到沒有左孩子的節點即可

node*

first_node

(node *now)

//尋找線索二叉樹遍歷的第乙個節點

2.尋找並訪問當前節點的後繼節點,重複執行步驟2,直到所有的節點都被訪問到。如何尋找後繼節點呢?如果此時節點的rtag==1時,rch指標指向的就是後繼節點,否則,根據中序遍歷的思想,遍歷完該節點後,接下來應該訪問其右子樹,話句話說,後繼節點一定是右子樹中第乙個被訪問的節點,這不正是first_node函式的功能嗎?
node*

next_node

(node *now)

//尋找遍歷的下乙個節點

完整**:
#pragma gcc optimize(2)

#include

using namespace std;

#define pi acos(-1.0)

#define e exp(1.0)

typedef

long

long ll;

struct node

;node *pre=

null

;void

create

(node *

&root)

//前序建立二叉樹

return;}

void

inorder

(node *now)

//中序遞迴將二叉樹進行線索化

if(pre!=

null

&&pre->rch==

null

) pre=now;

/*********/

inorder

(now->rch);}

return;}

node*

first_node

(node *now)

//尋找線索二叉樹遍歷的第乙個節點

node*

next_node

(node *now)

//尋找遍歷的下乙個節點

void

inorder_chain

(node *root)

putchar

('\n');

return;}

void

delete

(node *now)

//後序刪除二叉樹

return;}

intmain()

後續再補充線索二叉樹的後續遍歷演算法吧……

線索化二叉樹以及遍歷線索化二叉樹

1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

遍歷線索化二叉樹

常規的線索化方式 採用遞迴地呼叫的方式,判定條件是當前指標的左子樹是否為空 實現 public void midorder system.out.println this if this right null 對比 但是對二叉樹進行線索化之後,不存在空的左右指標,但是單獨設定每乙個指標的型別,故而條...