数据结构与算法(树)
2020-03-08 11:43
483 查看
树
特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
二叉树
二叉树是每个节点最多有两个子树的树结构。
二叉树的性质(特性):
性质1: 在二叉树的第i层上至多有2^(i-1)个结点(i>0)
性质2: 深度为k的二叉树至多有2^k - 1个结点(k>0)
性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
性质4:具有n个结点的完全二叉树的深度必为 log2(n+1)
性质5:对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)
二叉树的节点表示以及树的创建
class Node(object): """节点类""" def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchild class 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 elif cur.rchild == None: cur.rchild = node return else: #如果左右子树都不为空,加入队列继续判断 queue.append(cur.lchild) queue.append(cur.rchild)
二叉树的遍历
先序遍历 :根节点->左子树->右子树
def preorder(self, root): """递归实现先序遍历""" if root == None: return print root.elem self.preorder(root.lchild) self.preorder(root.rchild)
先序遍历 :左子树->根节点->右子树
def inorder(self, root): """递归实现中序遍历""" if root == None: return self.inorder(root.lchild) print root.elem self.inorder(root.rchild)
后序遍历:左子树->右子树->根节点
def postorder(self, root): """递归实现后续遍历""" if root == None: return self.postorder(root.lchild) self.postorder(root.rchild) print root.elem
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 数据结构与算法面试总结
- 数据结构与算法之五 链接列表
- 数据结构与算法简记:冒泡排序
- 三、数据结构与算法--排序(冒泡排序、选择排序)
- 数据结构与算法总结5_查找算法
- 浅析数据结构与算法1--栈和队列
- 数据结构与算法(5)顺序栈II
- 《数据结构与算法》学习笔记7 插入排序
- [数据结构与算法] 2,算法
- [数据结构与算法]模式匹配与文本处理-零宽度正预测先行断言 and 零宽度正回顾后发断言
- 数据结构与算法(三)两个数组实现MIN栈问题
- 山东理工大学 2015计科、软件《数据结构与算法》实践能力专题训练4:串、数组、广义表
- 初识数据结构与算法
- 数据结构与算法:三步学会红黑树--图文详解
- 数据结构与算法目录
- 数据结构与算法(C语言版)__顺序查找
- 数据结构与算法(C语言版)__循环链表
- 数据结构与算法(C语言版)__堆
- 数据结构与算法
- 数据结构与算法 —— 动态规划