python数据结构--二叉树
来源:互联网 发布:刻录机软件 编辑:程序博客网 时间:2024/06/05 16:34
python数据结构–二叉树
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)
二叉树的性质(特性)
性质1: 在二叉树的第i层上至多有
性质2: 深度为k的二叉树至多有
性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
- 节点的度:一个节点含有的子树的个数称为该节点的度;
性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)
性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)
(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
二叉树的节点表示以及树的创建
通过使用Node类中定义三个属性,分别为elem本身的值,还有lchild左孩子和rchild右孩子
class Node(object): """节点类""" def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchild
树的创建,创建一个树的类,并给一个root根节点,一开始为空,随后添加节点
#!/usr/bin/env python# -*- coding: utf-8 -*-# Created by xuehz on 2017/8/24class Node(object): """节点类""" def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchildclass Tree(object): """树类""" def __init__(self, root=None): self.root = root def add(self, elem): """为树添加节点""" node = Node(elem) # 如果树是空的,则对根节点赋值 if self.root == None: self.root = node else: queue = [] queue.append(self.root) # 对已有的节点进行层次遍历 while queue: # 弹出队列的第一个元素 cur = queue.pop(0) if cur.lchild == None: cur.lchild = node return else: queue.append(cur.lchild)#如果左右子树都不为空,加入队列继续判断 if cur.rchild is None: cur.rchild = node return else: queue.append(cur.rchild)#如果左右子树都不为空,加入队列继续判断 def breadth_travel(self): """广度遍历""" if self.root is None: return queue = [self.root] while queue: cur_node = queue.pop(0) print cur_node.elem, 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, node): """先序遍历""" if node is None: return print(node.elem, ) self.preorder(node.lchild) self.preorder(node.rchild) def inorder(self, node): """中序遍历""" if node is None: return self.inorder(node.lchild) print(node.elem, ) self.inorder(node.rchild) def postorder(self, node): """后序遍历""" if node is None: return self.postorder(node.lchild) self.postorder(node.rchild) print(node.elem, )if __name__ == "__main__": tree = Tree() tree.add(0) tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breadth_travel() print(" ") tree.preorder(tree.root) print(" ") tree.inorder(tree.root) print(" ") tree.postorder(tree.root) print(" ")
二叉树的遍历
广度优先遍历(层次遍历)
从树的root开始,从上到下从从左到右遍历整个树的节点
def breadth_travel(self, root): """利用队列实现树的层次遍历""" if root == None: return queue = [] queue.append(root) while queue: node = queue.pop(0) print node.elem, if node.lchild != None: queue.append(node.lchild) if node.rchild != None: queue.append(node.rchild)
深度优先遍历
这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)
先序遍历
先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
根节点->左子树->右子树
def preorder(self, root): """递归实现先序遍历""" if root == None: return print root.elem self.preorder(root.lchild) self.preorder(root.rchild)
中序遍历
在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点
def postorder(self, root): """递归实现后续遍历""" if root == None: return self.postorder(root.lchild) self.postorder(root.rchild) print root.elem
后序遍历
在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点
def postorder(self, root): """递归实现后续遍历""" if root == None: return self.postorder(root.lchild) self.postorder(root.rchild) print root.elem
先中、中后 唯一确定一棵树
- python数据结构--二叉树
- Python数据结构之二叉树
- python实战--数据结构二叉树
- python数据结构--二叉树建立与遍历
- python 数据结构之二叉搜索树
- python 数据结构四 之 二叉树和树
- python数据结构学习笔记-2016-11-27-01-二叉树
- 数据结构 —— 二叉树(Python实现)
- 「数据结构」二叉树的遍历以及Python实现
- 数据结构与算法之二叉树的Python简单实现
- 【数据结构】树与二叉树 基础要点+二叉树 Python 实现
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 数据结构-二叉树算法
- java数据结构:二叉树
- 数据结构---二叉树
- Java中常见状态码的含义
- Java随想
- composer命令整理
- 1025. 反转链表 (25)
- Xshell如何设置字体
- python数据结构--二叉树
- 设计模式之工厂模式
- java实现对Excel的读写操作
- MUi下拉刷新和上拉加载click事件失效问题
- 关于C++中的placement new操作符
- PEP8规范
- Handler机制
- 八大排序算法
- 【群论一】以A4为例说明群论中的商群到底有什么用?