二叉树

二叉树的基本概念

二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)

二叉树的性质(特性)

  • 性质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 时为根,除外)

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

二叉树的遍历

树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。

二叉树的创建及广度优先遍历

class Node:"""结点"""def __init__(self, item):self.item = itemself.lchild = None  # 左子节点self.rchild = None  # 右子节点class Tree:"""二叉树类"""def __init__(self, root=None):self.root = root  # 根节点def add(self, item):"""添加结点"""node = Node(item)if self.root == None:  # 如果根节点为空,直接赋值根节点self.root = nodeelse:queue = []  # 创建一个对列queue.append(self.root)  # 将根节点加入队列中while queue:  # 遍历结点# 弹出第一个结点cur = queue.pop(0)if cur.lchild == None:  # 判断此节点是否为空cur.lchild = node  # 如果为空,就把node放到此位置return  # 已经找到结点位置直接返回elif cur.rchild == None:cur.rchild = nodereturnelse:# 如果左右子树都不为空,没有位置添加node,# 就把左右子树的结点加入队列继续判断此子节点的左右子节点是否为空queue.append(cur.lchild)queue.append(cur.rchild)def travle(self):"""遍历二叉树广度优先遍历    """if self.root == None:  # 如果此树为空,直接返回returnqueue = []  # 创建一个队列queue.append(self.root)  # 将待遍历的结点加入while queue:  # 如果队列不为空,就一直循环node = queue.pop(0)  # 弹出队列第一个元素并打印出来print(node.item)# 接着判断该结点的左右子节点是否存在,如果存在就加入队列等待弹出打印if node.lchild != None:queue.append(node.lchild)if node.rchild != None:queue.append(node.rchild)if __name__ == '__main__':t1 = Tree()t1.add(1)t1.add(2)t1.add(3)t1.add(4)t1.add(5)t1.add(6)t1.add(7)t1.add(8)t1.add(9)t1.travle()  # 1  2  3  4  5  6  7  8  9

深度优先遍历及其前序,中序,后序会在下一篇讲解

二叉树的概念及其遍历方法 - python实现相关推荐

  1. 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)

    二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次. 而一般有四种遍历方法: 前序.中序.后序.层序,下面就分别讲一下四个遍历的思路以及代码实现 例如我 ...

  2. 二叉树的几种遍历方法

    二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次.根据定义中的某种次序,二叉树的遍历方式主要分为前序遍历,中序遍历,后序遍历以及层序遍历. 前序 ...

  3. 二叉树的四种遍历方法(前序遍历、中序遍历、后序遍历、层序遍历)有图有真相!!!

    文章目录 二叉树的四种遍历方式 前序遍历(Preorder Traversal) 中序遍历(Inorder Traversal) 后序遍历(Postorder Traversal) 层序遍历(Leve ...

  4. (九)二叉树的建立与遍历方法(c语言)(附代码与调试)

    一.二叉树 首先我们聊一聊什么是二叉树,二叉树就是n个节点的有限集合,该集合或者空集(称为空二叉树),或者由一个根节点和两课互不相交的分别称为根节点的左子树和右子树的二叉树组成. 一看这,嗨哟,挺复杂 ...

  5. 二叉树(构造与遍历方法)

    文章目录 二叉树 一.二叉树的构造 二.二叉树的深度遍历 1. 前序遍历 2. 中序遍历 3. 后序遍历 三.二叉树转链表 二叉树 一.二叉树的构造 #include<cstdio>usi ...

  6. 二叉树的四种遍历方法:前序、中序、后序、层次

    前/中/后序遍历也可分别称为前/中/后根遍历 #include <iostream> using namespace std;//二叉树的链式存储的结点 typedef struct Bi ...

  7. 全面剖析【二叉树】的各类遍历方法

    二叉树遍历 二叉树的遍历主要有四种: 前序.中序.后序和层序 遍历的实现方式主要是: 递归和非递归 递归遍历的实现非常容易,非递归的实现需要用到栈,难度系数要高一点. 1.二叉树节点的定义 二叉树的每 ...

  8. 二叉树的非递归遍历(python)

    class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution(obj ...

  9. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

最新文章

  1. Matlab与C/C++混合编程接口及应用
  2. js 从一个函数中传递值到另一个函数
  3. CodeForces - 1293D Aroma's Search(暴力)
  4. 织梦文章主表关联栏目查询 生成静态url语句
  5. qchart 图表_QChart双Y轴实时更新曲线图
  6. jqgrid mvc_jqGrid,REST,AJAX和Spring MVC集成
  7. 压缩 质量不变_来了!业内首个HEIF图像高质量压缩FPGA加速方案
  8. HDU 5514 欧拉函数应用
  9. python中如何将列表按列打印_如果列表只包含0,我如何在python中打印?
  10. Kotlin的匿名方法实现接口回调
  11. python数学符号读法大全_数学符号读法大全
  12. Java 使用OpenCV进行颜色识别
  13. JAVA山地车deca_越野怪兽 JAVA摆渡人 (ANIMA)山地车
  14. STM32网络之DMA控制器
  15. 团队管理之—— 定目标:让你的方向与公司的方向保持一致
  16. 个人电脑windows装青龙面板,本地运行,无需服务器,本人亲测成功
  17. 编辑精选 | 每周为你推荐Github热门项目、学习资源等优质内容!
  18. 版权所有者删除链接要求大部分被尊重 谷歌去年共删3.45亿个侵权
  19. APISpace 全球快递物流查询API接口 免费好用
  20. 为你的CSDN博客添加CNZZ流量统计功能

热门文章

  1. GET POST方法长度限制
  2. UILabel 的属性设置
  3. java 自动装箱自动拆箱
  4. 类加载是为了执行静态方法
  5. 三星Nexus S刷回官方4.0.4教程
  6. 无线网络MIMO技术浅谈
  7. 泛型技巧系列:类型字典和Type Traits
  8. Linux下记住Gitee账户密码
  9. Nginx反向代理与负载均衡等配置文件示例
  10. Spring JDBC和JdbcTemplate CRUD与DataSource示例