python二叉树的创建与遍历
二叉樹的基本概念:
一個結點的層次直觀上來說就是其所在的行,其中根結點層次為1(第一行),其子結點層次為2(第二行),以此類推
二叉樹的深度(高度):指的是二叉樹中的最大葉子結點所在的層。二叉樹的深度=max(左子樹深度,右子數深度)+1,可用遞歸的方式實現。
二叉樹結點的度:指該結點分支的個數(0,1,2)
完全二叉樹:若設二叉樹的高度為h,除第 h 層外,其它各層 (1-h-1) 的結點數都達到最大個數,第h層有葉子結點,并且葉子結點都是從左到右依次排布
滿二叉樹:除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹
平衡二叉樹(AVL):二叉排序樹,空,或左子樹和右子樹都是平衡二叉樹,且深度差<=1
性質:
(1) 在非空二叉樹中,第i層的結點總數不超過, i>=1;
(2) 深度為h的二叉樹最多有個結點(h>=1),最少有h個結點;
(3) 對于任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1;度為1的結點數N1=N-N0-N2
(4) 具有n個結點的完全二叉樹的深度為(注:[ ]表示向下取整)
(5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系:
若I為結點編號(編號從1開始)則 如果I>1,則其父結點的編號為I/2;
如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;
如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。
(若編號從0開始,設l為父節點編號,則其左兒子的編號為2*l + 1, 其右兒子的編號為2*l + 2)
二叉樹的創建與遍歷:
# /usr/bin/pyhton #coding=utf-8 # #author:yumianzhanclass Tree_node():def __init__(self, v = None, l = None, r = None):self.value = vself.left = lself.right = r#創建二叉樹 def creat(root):a = input('Inter a key:')if a is '!':print(a)root = Noneelse:root = Tree_node(v = a)root.left = creat(root.left)root.right = creat(root.right)return root#前序遍歷 def preorder(root):if root is None:returnprint(root.value)preorder(root.left)preorder(root.right)#中序遍歷 def inorder(root):if root is None:returninorder(root.left)print(root.value)inorder(root.right)#后序遍歷 def postorder(root):if root is None:returnpostorder(root.left)postorder(root.right)print(root.value)#測試 def main():root = Noneroot = creat(root)print(root)print('前序遍歷:')preorder(root)print('中序遍歷:')inorder(root)print('后序遍歷:')postorder(root)if __name__ == '__main__':main()運行程序,建立二叉樹如下:
前序遍歷結果為: a ?b ?c ?d ?e ?f
中序遍歷結果為:c ?b ?d ?a ?f ?e?
后序遍歷結果為:c ?d ?b ?f ?e ?a?
總結
以上是生活随笔為你收集整理的python二叉树的创建与遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米9和小米9se的区别(我的小米云服务
- 下一篇: Python矩阵的创建(不使用numpy