Pythonのデータ構造とアルゴリズム - ツリー、バイナリツリー

基本的な考え方

1.定義:木(ツリー)N(≧0)の二つの条件を満足するノードTの限られたセットである:唯一一つの特定は、(ルート)ノードルートと呼ばれる、残りのノードは、に分けることができます。 m個の各セットは、ツリーであり、そのサブツリーは、(サブツリー)をルートと前記(m≥0)互いに素の有限セットT1、T2、...、Tmを、。

2.基本コンセプト

  • ノードの数サブツリーは、ノードの次数と呼ばれる、ツリー度がツリー内のノードの最大次数です。
  • リーフノードは、ゼロ度ブランチノードではなく、ルートノード以外のブランチノードが内部と呼ばれ、0度または終端ノードと呼ばれるノードと呼ばれます。
  • ルートノードのサブツリーは、このノードが親ノードその、同じノード内の各サブノード間のノードを兄弟と呼ぶ呼ばれ、ノードの子ノードと呼ばれます。ツリーのルートノードがリーフノードに子がない、親ノードを持っていません。
  • KI KIシリーズノードK1、K2、...、KI、KI + 1、...、KJ、及び満足+ 1は、親ノードは、K1からKJ、J-1のパスの長さへのパスと呼ばれすなわち、パス内のエッジの数。前のノードの後ろのパスは、ノードの祖先であり、ノードは、フロント子孫ノードの背後にあります。
  • 親ノードプラス層の数にノードの層は、層の数は、ルートノードとして定義されます。ツリー内の層の最大数は、ツリーのノードの高さまたは深さと呼ばれます。
  • 森の木と呼ばれる集合M(m≥0)ばらばらの木。森になるために、ツリーのルートを削除し、森林は新しいルートノードがツリーになっ追加。

二進木

定義と特性

1.定義:バイナリツリー(バイナリツリー)は、nの有限集合(≧0)ノードであり、またはそれは空集合である(N = 0)、またはルートノードと2つの互いに素である、と呼ばれますバイナリ左サブツリーと右サブツリー組成物。唯一の子ノードが、左右を区別した場合でも、通常のバイナリ順序木、左と右の子の子の間でバイナリツリー厳密に区別は異なります。

2.バイナリツリー機能

  • レベルのノードのバイナリツリーI(i≥1)まで2 ^ {} 1 I-。2 I - 。1番目。
  • 深度为k(k≥1)的二叉树最多有2^k-12k1个节点。
  • 在任意一棵二叉树中,树叶的数目比度数为2的节点的数目多一。
  • 满二叉树 :深度为k(k≥1)时有2^k-12k1个节点的二叉树。
  • 完全二叉树 :只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。

二叉树的遍历

遍历 :沿某条搜索路径周游二叉树,对树中的每一个节点访问一次且仅访问一次。

先序遍历: 先访问树根,再访问左子树,最后访问右子树;
中序遍历: 先访问左子树,再访问树根,最后访问右子树;
后序遍历: 先访问左子树,再访问右子树,最后访问树根;
层次遍历: 从根节点开始,逐层从左向右进行遍历。

递归思想和实践

1.什么是递归?

所谓递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。这里的直接调用是指一个函数的函数体中含有调用自身的语句,间接调用是指一个函数在函数体里有调用了其它函数,而其它函数又反过来调用了该函数的情况。

2.递归函数调用的执行过程分为两个阶段

递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件。
回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。

3.优点与缺点

优点:递归可以把问题简单化,让思路更为清晰,代码更简洁
缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果

# 求n的阶乘
def recursion(n):
  # 递归终止条件
  if n < 1:
    return 1
  return n * recursion(n - 1)

print("n!=",recursion(5))

二叉树的代码实现

二叉树顺序存储

二叉树本身是一种递归结构,可以使用Python list 进行存储。但是如果二叉树的结构比较稀疏的话浪费的空间是比较多的。

  • 空结点用None表示
  • 非空二叉树用包含三个元素的列表[d,l,r]表示,其中d表示根结点,l,r左子树和右子树。
 1 ['A',['B',None,None
 2      ],
 3      ['C',['D',['F',None,None],
 4                ['G',None,None],
 5           ],     
 6           ['E',['H',None,None],
 7                ['I',None,None],
 8           ],
 9      ]
10 ]
顺序存储代码
 1 bitree.py 二叉树的实现
 2 
 3 思路分析: 
 4 1. 使用链式存储
 5   节点类设计上有两个属性变量引用左孩子和右孩子
 6 2. 操作类完成二叉树的遍历
 7 """
 8 from day2.squeue import SQueue
 9 
10 # 二叉树节点
11 class TreeNode:
12   def __init__(self, data=None, left=None, right=None):
13     self.data = data
14     self.left = left
15     self.right = right
16 
17 #  二叉树操作
18 class Bitree:
19   def __init__(self, root=None):
20     self.root = root  # 获取树根
21 
22   # 先序遍历
23   def preOrder(self,node):
24     if node is None:
25       return
26     print(node.data,end=' ')
27     self.preOrder(node.left)
28     self.preOrder(node.right)
29 
30   #  中序遍历
31   def inOrder(self, node):
32     if node is None:
33       return
34     self.inOrder(node.left)
35     print(node.data, end=' ')
36     self.inOrder(node.right)
37 
38   #  后序遍历
39   def postOrder(self, node):
40     if node is None:
41       return
42     self.postOrder(node.left)
43     self.postOrder(node.right)
44     print(node.data, end=' ')
45 
46   # 层次遍历
47   def levelOrder(self,node):
48     sq = SQueue()
49     sq.enqueue(node) # 从node遍历
50     while not sq.is_empty():
51       node = sq.dequeue() # 出队一个
52       print(node.data,end=' ') # 遍历数据
53       if node.left:
54         sq.enqueue(node.left)
55       if node.right:
56         sq.enqueue(node.right)
57 
58 if __name__ == "__main__":
59   #  后序遍历 BFGDIHECA
60   # 构建树 (笔记中)
61   b = TreeNode('B')
62   f = TreeNode('F')
63   g = TreeNode('G')
64   d = TreeNode('D', f, g)
65   i = TreeNode('I')
66   h = TreeNode('H')
67   e = TreeNode('E', i, h)
68   c = TreeNode('C', d, e)
69   a = TreeNode('A', b, c)  # 树根
70 
71   #  初始化树对象,得到树根
72   bt = Bitree(a)
73   # 先序
74   bt.preOrder(bt.root)
75   print()
76   #  中序
77   bt.inOrder(bt.root)
78   print()
79   bt.postOrder(bt.root)
80   print()
81   bt.levelOrder(bt.root)
82   print()
链式存储代码

 

おすすめ

転載: www.cnblogs.com/maplethefox/p/10988684.html