树
任意一个二叉树,叶子节点数为x,度数为2的节点z总和为y:x = y + 1
完全二叉树,从上到下,从左到右编号,编号为i的节点,其左孩子必是2i,右孩子必是2i + 1,其父节点必为i//2
用队列实现,先把根节点输入进去,第一层结束,输出根节点,查找其子节点,第二层结束,输出其最左边节点,找这个节点的子节点,以此类推。
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: Caramel
@file: 7.1_binart_tree.py
@time: 2020/02/13
@desc:链表实现二叉树
"""
class node(object):
def __init__(self, item):
self.ele = item
self.lchild = None
self.rchild = None
class tree(object):
def __init__(self):
self.root = None
def add(self, item):
nnode = node(item)
if self.root == None:
self.root = nnode
return
queue = []
queue.append(self.root)
while queue:
cur_node = queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild = nnode
return
else:
'''左孩子存在,先加入队列'''
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild = nnode
return
else:
queue.append(cur_node.rchild)
def breadth_travel(self):
'''广度遍历'''
if self.root is None:
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
print(cur_node.ele, end = ' ')
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
def preorder(self, nnode):
'''前序遍历'''
if nnode == None:
return
print(nnode.ele, end = ' ')
self.preorder(nnode.lchild)
self.preorder(nnode.rchild)
def inorder(self, nnode):
'''中序遍历'''
if nnode == None:
return
self.inorder(nnode.lchild)
print(nnode.ele, end=' ')
self.inorder(nnode.rchild)
def postorder(self, nnode):
'''后序遍历'''
if nnode == None:
return
self.postorder(nnode.lchild)
self.postorder(nnode.rchild)
print(nnode.ele, end=' ')
if __name__ == '__main__':
trees = tree()
trees.add(1)
trees.add(2)
trees.add(3)
trees.add(4)
trees.add(5)
trees.breadth_travel()
print(' ')
trees.preorder(trees.root)
print(' ')
trees.inorder(trees.root)
print(' ')
trees.postorder(trees.root)