数据结构与算法:树与二叉树python实现
最近復習一遍數據結構與算法,做一些筆記,大家可以一起復習。
一、樹的一些容易混淆的定義:
結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;
樹的深度(或高度):樹中最大的結點層;
滿二叉樹:這個定義國內和國外有較大的區別:
國內教程定義:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。如圖1:
圖1?
國外(國際)定義:a binary tree T is full if each node is either a leaf or possesses exactly two childnodes.
大意為:如果一棵二叉樹的結點要么是葉子結點,要么它有兩個子結點,這樣的樹就是滿二叉樹。(一棵滿二叉樹的每一個結點要么是葉子結點,要么它有兩個子結點,但是反過來不成立,因為完全二叉樹也滿足這個要求,但不是滿二叉樹),如圖2:
圖2?
滿二叉樹的任意節點,要么度為0,要么度為2.換個說法即要么為葉子結點,要么同時具有左右孩子。霍夫曼樹是符合這種定義的,滿足國際上定義的滿二叉樹,但是不滿足國內的定義。
完全二叉樹:若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,并且葉子結點都是從左到右依次排布,這就是完全二叉樹。
完美二叉樹(可能國外才有):當所有的葉子節點都在同一層就是完美二叉樹,毫無間隙填充了 h 層。對應國內滿二叉樹。
二、樹數據結構python實現
我們將定義一個具有根值屬性的類,以及左和右子樹,?這個表示更接近于面向對象的編程范例。
屬性:根、左右子樹
方法:設置根、左右子樹,獲取根和左右子樹
#定義二叉樹類 class BinaryTree(object):def __init__(self, root, left = None, right = None):self.root = rootself.left = leftself.right = rightdef getRoot(self):return self.rootdef setRoot(self, root):self.root = rootdef getLeft(self):return self.leftdef getRight(self):return self.right#向樹中添加左子樹def insertLeft(self, newNode):if self.left == None:self.left = BinaryTree(newNode)else: #左子樹具有節點,放到下一層t = BinaryTree(newNode)t.left = self.leftself.left = t #向樹中添加右子樹def insertRight(self, newNode):if self.right == None:self.right = BinaryTree(newNode)else:t = BinaryTree(newNode)t.right = self.rightself.right = t三、二叉樹的遍歷
不知道你有沒有發現,二叉樹其實是一種遞歸結構,因為單獨拿出來一個 subtree 子樹出來,其實它還是一棵樹。那遍歷它就很方便啦,我們可以直接用遞歸的方式來遍歷它。但是當處理順序不同的時候,樹又分為三種遍歷方式:
- 先(根)序遍歷: 先處理根,之后是左子樹,然后是右子樹
- 中(根)序遍歷: 先處理左子樹,之后是根,最后是右子樹
- 后(根)序遍歷: 先處理左子樹,之后是右子樹,最后是根
設置在類中的方法:
#遍歷樹def preorder(self):print(self.root)if self.left:self.left.preorder()if self.right:self.right.preorder()外部函數的方法:
#前序遍歷樹的外部函數 def preorder(tree):if tree:print(tree.getRoot())preorder(tree.getLeft())preorder(tree.getRight()) #后序遍歷樹的外部函數 def postorder(tree):if tree:postorder(tree.getLeft())postorder(tree.getRight())print(tree.getRoot()) #中序遍歷樹的外部函數 def midorder(tree):if tree:midorder(tree.getLeft())print(tree.getRoot())midorder(tree.getRight())以上哪種方式實現前序最好? 答案是在這種情況下,實現前序作為外部函數可能更好。原因是你很少只是想遍歷樹。在大多數情況下,將要使用其中一個基本的遍歷模式來完成其他任務。 事實上,我們將在下面的例子中看到后序遍歷模式與我們前面編寫的用于計算分析樹的代碼非常接近。 因此,我們用外部函數實現其余的遍歷。
補充:給點節點的前序序列和中序序列,可確定一棵二叉樹。不同形態的二叉樹的數目恰好是前序序列均為的二叉樹所能得到的中序序列的數目。這個數目為,含有n個節點的不相似的二叉樹的數目,二者相同。
github代碼:https://github.com/makang101/python-data-structure
參考:
problem-solving-with-algorithms-and-data-structure-using-python 中文版
數據結構(C語言版)嚴蔚敏
?
總結
以上是生活随笔為你收集整理的数据结构与算法:树与二叉树python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法:排序算法的稳定性以及各性
- 下一篇: python错误处理