python 樹遍歷算法
遍歷是訪問樹的所有節(jié)點(diǎn)的過程,也可以打印它們的值。因?yàn)樗泄?jié)點(diǎn)都通過邊(鏈接)連接,所以我們始終從根(頭)節(jié)點(diǎn)開始。也就是說,我們不能隨機(jī)訪問樹中的一個(gè)節(jié)點(diǎn)。我們用三種方式來遍歷一棵樹
- 按順序遍歷
- 預(yù)購(gòu)遍歷
- 后序遍歷
按順序遍歷
在這種遍歷方法中,首先訪問左側(cè)子樹,然后訪問根,然后訪問右側(cè)子樹。我們應(yīng)該永遠(yuǎn)記住每個(gè)節(jié)點(diǎn)本身可能代表一個(gè)子樹。
在下面的python程序中,我們使用node類為根節(jié)點(diǎn)以及左右節(jié)點(diǎn)創(chuàng)建占位符。然后我們創(chuàng)建一個(gè)插入函數(shù)來將數(shù)據(jù)添加到樹中。最后,inorder遍歷邏輯通過創(chuàng)建一個(gè)空列表并首先添加左節(jié)點(diǎn),然后添加根節(jié)點(diǎn)或父節(jié)點(diǎn)來實(shí)現(xiàn)。最后添加左節(jié)點(diǎn)以完成inorder遍歷。請(qǐng)注意,對(duì)于每個(gè)子樹重復(fù)此過程,直到遍歷所有節(jié)點(diǎn)。
class node: def __init__(self, data): self.left = none self.right = none self.data = data # insert node def insert(self, data): if self.data: if data < self.data: if self.left is none: self.left = node(data) else: self.left.insert(data) elif data > self.data: if self.right is none: self.right = node(data) else: self.right.insert(data) else: self.data = data # print the tree def printtree(self): if self.left: self.left.printtree() print( self.data), if self.right: self.right.printtree() # inorder traversal # left -> root -> right def inordertraversal(self, root): res = [] if root: res = self.inordertraversal(root.left) res.append(root.data) res = res + self.inordertraversal(root.right) return res root = node(27) root.insert(14) root.insert(35) root.insert(10) root.insert(19) root.insert(31) root.insert(42) print(root.inordertraversal(root))
當(dāng)上面的代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果 -
[10, 14, 19, 27, 31, 35, 42]
預(yù)購(gòu)遍歷
在這種遍歷方法中,首先訪問根節(jié)點(diǎn),然后訪問左邊的子樹,最后訪問右邊的子樹。
在下面的python程序中,我們使用node類為根節(jié)點(diǎn)以及左右節(jié)點(diǎn)創(chuàng)建占位符。然后我們創(chuàng)建一個(gè)插入函數(shù)來將數(shù)據(jù)添加到樹中。最后,pre- order遍歷邏輯通過創(chuàng)建一個(gè)空列表并首先添加根節(jié)點(diǎn),然后添加左節(jié)點(diǎn)來實(shí)現(xiàn)。最后添加正確的節(jié)點(diǎn)以完成預(yù)訂遍歷。請(qǐng)注意,對(duì)于每個(gè)子樹重復(fù)此過程,直到遍歷所有節(jié)點(diǎn)。
class node: def __init__(self, data): self.left = none self.right = none self.data = data # insert node def insert(self, data): if self.data: if data < self.data: if self.left is none: self.left = node(data) else: self.left.insert(data) elif data > self.data: if self.right is none: self.right = node(data) else: self.right.insert(data) else: self.data = data # print the tree def printtree(self): if self.left: self.left.printtree() print( self.data), if self.right: self.right.printtree() # preorder traversal # root -> left ->right def preordertraversal(self, root): res = [] if root: res.append(root.data) res = res + self.preordertraversal(root.left) res = res + self.preordertraversal(root.right) return res root = node(27) root.insert(14) root.insert(35) root.insert(10) root.insert(19) root.insert(31) root.insert(42) print(root.preordertraversal(root))
當(dāng)上面的代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果 -
[27, 14, 10, 19, 35, 31, 42]
后序遍歷
在這個(gè)遍歷方法中,最后訪問根節(jié)點(diǎn),因此名稱。首先我們遍歷左子樹,然后遍歷右子樹,最后遍歷根節(jié)點(diǎn)。
在下面的python程序中,我們使用node類為根節(jié)點(diǎn)以及左右節(jié)點(diǎn)創(chuàng)建占位符。然后我們創(chuàng)建一個(gè)插入函數(shù)來將數(shù)據(jù)添加到樹中。最后,通過創(chuàng)建一個(gè)空列表并首先添加左節(jié)點(diǎn),然后添加右節(jié)點(diǎn)來實(shí)現(xiàn)post- order遍歷邏輯。最后,根或父節(jié)點(diǎn)被添加以完成后序遍歷。請(qǐng)注意,對(duì)于每個(gè)子樹重復(fù)此過程,直到遍歷所有節(jié)點(diǎn)。
class node: def __init__(self, data): self.left = none self.right = none self.data = data # insert node def insert(self, data): if self.data: if data < self.data: if self.left is none: self.left = node(data) else: self.left.insert(data) elif data > self.data: if self.right is none: self.right = node(data) else: self.right.insert(data) else: self.data = data # print the tree def printtree(self): if self.left: self.left.printtree() print( self.data), if self.right: self.right.printtree() # postorder traversal # left ->right -> root def postordertraversal(self, root): res = [] if root: res = self.postordertraversal(root.left) res = res + self.postordertraversal(root.right) res.append(root.data) return res root = node(27) root.insert(14) root.insert(35) root.insert(10) root.insert(19) root.insert(31) root.insert(42) print(root.postordertraversal(root))
當(dāng)上面的代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果 -
[10, 19, 14, 31, 42, 35, 27]