tree 父节点,儿子节点,兄弟节点,子树,叶子节点(没有子节点的节点)。
二叉树,节点深度,树的高度(节点深度+1),树的宽度(最多节点的层级的节点数),数的size(二叉树的节点总个数)。
满二叉树 :每个非叶子节点包含两个数。
完美二叉树
完全二叉树
二叉树的表示
二叉树的遍历
二叉树是一种递归结构,单独一个subtree出来,它还是一棵树,
先序遍历: 先处理根,之后左子树,然后右子树
中序遍历: 先处理左子树,然后根,最后是右子树
后续遍历:先处理左子树,然后右子树,最后是根
node_list = [
{"data": 'A', 'left': 'B', 'right': 'C', 'is_root': True},
{"data": 'B', 'left': 'D', 'right': 'E', 'is_root': False},
{"data": 'D', 'left': None, 'right': None, 'is_root': False},
{"data": 'E', 'left': 'H', 'right': None, 'is_root': False},
{"data": 'H', 'left': None, 'right': None, 'is_root': False},
{"data": 'C', 'left': 'F', 'right': 'G', 'is_root': False},
{"data": 'F', 'left': None, 'right': None, 'is_root': False},
{"data": 'G', 'left': 'I', 'right': 'J', 'is_root': False},
{"data": 'I', 'left': None, 'right': None, 'is_root': False},
{"data": 'J', 'left': None, 'right': None, 'is_root': False},
]
class BinTreeNode(object):
def __init__(self, data, left=None, right=None):
self.data, self.left, self.right = data, left, right
class BinTree(object):
def __init__(self, root=None):
self.root = root
@classmethod
def build_form(cls, node_list):
"""通过节点信息构造二叉树
两次遍历,第一次遍历构造node节点
第二次遍历给root和孩子赋值
最后我们用root初始化这个类并返回一个对象
"""
node_dict = {}
for node_data in node_list:
data = node_data["data"]
node_dict[data] = BinTreeNode(data)
for node_data in node_list:
data = node_data['data']
node = node_dict[data]
if node_data['is_root']:
root = node
node.left = node_dict.get(node_data['left'])
node.right = node_dict.get(node_data['right'])
return cls(root)
def preorder_trav(self, subtree):
"""先序遍历"""
if subtree is not None:
print(subtree.data)
self.preorder_trav(subtree.left)
self.preorder_trav(subtree.right)
btree = BinTree.build_form(node_list)
btree.preorder_trav(btree.root)