算法六:树、二叉树(算法部分)
一、树的概念
树:
同前面的线性序列不一样,前面的线性序列都是一维的;但树是二维或多维的
树的节点,即列表中元素。
二、二叉树的概念
二叉树:
是一种特殊的树,每个节点最多只能有0,1,2个子节点
二叉树(binary)是一种特殊的树。二叉树的每个节点最多只能有2个子节点:
四种二叉树
- 完全二叉树
- 满二叉树
- 平衡二叉树
- 排序二叉树,二叉查找树,,二叉搜索树
完全二叉树:
满二叉树:
平衡二叉树:左右两个子树的高度差的不超过1,,并且左右两个子树都是一棵平衡二叉树。
排序二叉树:又称为,二叉查找树,也称为二叉搜索树。
如果我们给二叉树加一个额外的条件,每个节点都不小于它左子树的任意节点,且都不大于它右子树的任意节点,得到一种被称作二叉搜索树(binary search tree)的特殊二叉树
二叉搜索树可以方便的实现搜索算法。在搜索元素x的时候,我们可以将x和根节点比较:
- 如果x等于根节点,那么找到x,停止搜索 (终止条件)
- 如果x小于根节点,那么搜索左子树
- 如果x大于根节点,那么搜索右子树
树的存储:
树,一般不使用顺序表存储,而使用链式的存储。
二叉树的性质:
三、树的实现
先序遍历:
中序遍历:
后序遍历:
class Node: """二叉树的节点""" def __init__(self, item): self.elem = item self.lchild = None self.rchild = None class Tree: """二叉树""" def __init__(self): self.root = None def add(self, item): """添加:按广度优先(层次优先)的方式添加(类似队列),以完全二叉树为例添加""" node = Node(item) if self.root is None: self.root = node return queue = [self.root] while queue: cur_node = queue.pop(0) if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) if cur_node.rchild is None: cur_node.rchild = node 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.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) print("=============") tree.breadth_travel() print("=============") tree.preorder(tree.root) print("=============") tree.inorder(tree.root) print("=============") tree.postorder(tree.root)
可以根据中序和先序,或中序和后序画出唯一的一棵树,但根据先序和后序,不能画出唯一的一棵树。
posted on 2018-01-07 13:50 myworldworld 阅读(143) 评论(0) 收藏 举报