資料結構 線索二叉樹 python實現

2021-10-04 23:35:15 字數 3432 閱讀 2433

線索二叉樹是在普通二叉樹的基礎上對根節點上的空指標域做了改變,定義使左指標指向當前節點的前驅節點,右指標指向當前節點的後繼節點。這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹(threaded binarytree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

線索二叉樹應用案例

說明:當線索化二叉樹後,node節點的 屬性 left 和 right ,有如下情況:

(1)left 指向的是左子樹,也可能是指向的前驅節點. 比如 ① 節點 left 指向的左子樹, 而 ⑩ 節點的 left 指向的就是前驅節點.

(2)right指向的是右子樹,也可能是指向後繼節點,比如 ① 節點right 指向的是右子樹,而⑩ 節點的right 指向的是後繼節點.

這次**主要使用python來完成將普通二叉樹轉變成中序線索二叉樹。根據上面的**來構建二叉樹。**完成後通過呼叫葉子節點的left和right來測試**正確與否。

先來分析一下10號節點,根據我們對線索二叉樹的定義可知。我們需要先要先得到二叉樹的中序遍歷序列:。所以10號節點的前驅節點為3,後繼節點為1。所以如果線索化是正確的,我們呼叫10號節點的左右指標,得到的兩個節點為3,1。

#線索化二叉樹

#二叉樹

#先建立結點

class

heronode

(object):

def__init__

(self,no,name)

: self.no = no

self.name= name

self.left=

none

self.right=

none

''' 1、如果lefttype==0,表示指向左子樹;

lefttype==1,表示指向前驅節點

2、如果righttype==0,表示指向右子樹;

righttype==1,表示指向後繼節點

'''self.lefttype=

none

self.righttype=

none

defsetleft

(self,node)

: self.left = node

defsetright

(self,node)

: self.right = node

#中序遍歷線索化

class

threadbinarytree

(object):

def__init__

(self)

: self.root=

none

#為了實現線索化,需要增加這個屬性,保留前乙個節點

self.pre=

none

defsetroot

(self,root)

: self.root = root

#編寫二叉樹進行線索的方法

defthreadednode

(self,node)

:if node ==

none

:return

self.threadednode(node.left)

#處理當前節點的的前驅節點

if node.left==

none

: node.left=self.pre

node.lefttype=

1if self.pre!=

none

and self.pre.right ==

none

:#前驅節點的右指標指向當前節點

self.pre.right=node

self.pre.righttype=

1

self.pre = node

self.threadednode(node.right)

defthreadedlist

(self)

: node = self.root

while

(node!=

none):

while

(node.lefttype==0)

: node=node.left

print

("no = {}; name = {}"

.format

(node.no,node.name)

)while

(node.righttype==1)

: node=node.right

print

("no = {}; name = {}"

.format

(node.no,node.name)

)

node = node.right

node1 = heronode(1,

'關勝'

)node2 = heronode(3,

'劉備'

)node3 = heronode(6,

'張飛'

)node4 = heronode(8,

'曹操'

)node5 = heronode(10,

'李逵'

)node6 = heronode(14,

'大力'

)print

('測試中序線索二叉樹的功能'

)tree = threadbinarytree(

)node1.setleft(node2)

node1.setright(node3)

node2.setleft(node4)

node2.setright(node5)

node3.setleft(node6)

tree.setroot(node1)

tree.threadednode(node1)

leftnode = node5.left

rightnode= node5.right

print

('id={};name={}'

.format

(leftnode.no,leftnode.name)

)print

('id={};name={}'

.format

(rightnode.no,rightnode.name)

)print

('list:'

)tree.threadedlist(

)

**執行結果為:

線索二叉樹 資料結構

按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...

資料結構(線索二叉樹)

線索二叉樹的前序,中序,後序 typedef struct nodenode 前序線索二叉樹 參照中序即可 void prethread node p,node pre if pre null pre rchild null pre p if p ltag 0 prethread p lchild,...

資料結構 線索二叉樹

1.定義 在二叉樹的結點上加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種遍歷方式 前序 中序 後序或層序 進行遍歷,使其變為線索二叉樹的過程稱為對二叉樹進行線索化。2.本質 二叉樹的遍歷實質上是對乙個非線性結構進行線性化的過程,它使得每個結點 除第乙個和最後乙個 在這些線性序列中有且僅有乙個直接前驅...