二叉樹的遍歷與線索化

2021-10-05 02:54:51 字數 3302 閱讀 8688

二叉樹遍歷:

按一定規律對二叉樹中的每個結點進行訪問且僅訪問一次。

二叉樹的基本結構由根結點、左子樹和右子樹組成。

l、d、r分別表示遍歷左子樹、訪問根結點、遍歷右子樹,

那麼對二叉樹的遍歷順序就可以有:

在以上六種方式中,按先左後右的順序:就只剩下dlr 、ldr 和lrd三種。

根據對根的訪問先後順序:

先序遍歷(dlr)操作過程

若二叉樹為空,則為空操作,否則依次執行如下操作:

(1)訪問根結點;

(2)按先序遍歷左子樹;

(3)按先序遍歷右子樹。

中序遍歷(ldr)操作過程

若二叉樹為空,則為空操作,否則依次執行如下操作:

(1)按中序遍歷左子樹;

(2)訪問根結點;

(3)按中序遍歷右子樹。

後序遍歷(lrd)操作過程

若二叉樹為空,則為空操作,否則依次執行如下操作:

(1)按後序遍歷左子樹;

(2)按後序遍歷右子樹;

(3)訪問根結點。

如下二叉樹,其先序、中序、後序遍歷的序列為:

表示式求值:(a + b * c) – d / e

中綴:表示式通常形式,只是沒有括號;

字首:波蘭表示式,波蘭邏輯學家j.lukasiewicz提出;

字尾:逆波蘭表示式,計算機易於求值。

先序遍歷演算法:

void

preorder

(bitree root)

}

中序遍歷演算法:

void

inorder

(bitree root)

}

後序遍歷演算法:

void

postorder

(bitree root)

}

中序遍歷二叉樹的遞迴過程:

遞迴演算法的時間複雜度:

1. 輸出二叉樹中的結點

給出的是先序的演算法,其他兩種只需將訪問操作變為輸出操作即可。

void

preorder

(bitree root)

/*先序遍歷二叉樹,root為指向二叉樹根結點的指標*/

}

2. 輸出二叉樹中的葉子結點

void

preorder

(bitree root)

/*先序遍歷二叉樹, root為指向二叉樹根結點的指標*/

}

3. 統計葉子結點數目方法1(後序遍歷):

/* leafcount儲存葉子結點數目的全域性變數,呼叫之前初始化值為0 */

void

leaf

(bitree root)

}

方法2(後序遍歷):

採用分治演算法,如果是空樹,返回0;如果只有乙個結點,返回1;否則為左右子樹的葉子結點數之和。

int

leaf_b

(bitree root)

4. 建立二叉鍊錶方式儲存的二叉樹給定二叉樹遍歷序列,建立二叉樹(鍊錶)。

這裡說的遍歷序列是一種「擴充套件遍歷序列」:用小圓點顯示表示空子樹。

如,先序遍歷序列a b . d f. .g . .c . e . h . .

【演算法思想】

讀入當前根結點的資料,如果是「.」則將當前樹根置為空,否則申請乙個新結點,存入當前根結點的資料,分別用當前根結點的左子域和右子域進行遞迴呼叫,建立左、右子樹。

void

createbitree

(bitree *bt)

}

5. 求二叉樹的高度高度其實就是左右子樹高度最大值+1。

後序演算法:

int

posttreedepth

(bitree bt)

/* 後序遍歷求二叉樹的高度遞迴演算法 */

else

return(0

);/* 如果是空樹,則返回0 */

}

先序演算法:

void

pretreedepth

(bitree bt,

int h)

/* h為bt指向結點所在層次,初值為1*/

/*depth為當前求得的最大層次,為全域性變數,初值為0 */

}

6. 按樹狀列印二叉樹示意:

【演算法思想】

二叉樹的橫向列印應是豎向顯示的90度旋轉,恰好為逆中序順序(rdl)。

每次遞迴進層時層深度加1。

void

printtree

(bitree bt,

int nlayer)

//nlayer:結點層次

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

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

遍歷線索化二叉樹

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

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

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