数据结构与算法(四):二叉树
二叉树
基本概念
- 结点:结构中的逻辑单元,用于保存数据
- 度数:一个结点的子结点个数
二叉树的性质
- 最多两个子树,有左右区分
- 第i{i}i层的最多有2i−12^{i-1}2i−1个节点
二叉树种类
- 满二叉树:所有分支结点的度数都是2
- 扩充二叉树:对二叉树加入足够多的叶子结点,使所有原结点变为度数为2的分支结点
- 完全二叉树:最后一层叶子都在左边
- 平衡二叉树:
定义一个二叉树
class Node:def __init__(self, value=None, left=None, right=None):self.value = valueself.left = leftself.right = right
1. 二叉树遍历
- 深度遍历(前中后)
- 广度遍历
#递归
def preTraverse(note):if note == None:returnprint(note.value)preTraverse(note.left)preTraverse(note.right) def midTraverse(note):if note == None:returnmidTraverse(note.left)print(note.value)midTraverse(note.right)def afterTraverse(note):if note == None:return afterTraverse(note.left)afterTraverse(note.right)print(note.value)
#迭代
# pre
def preIter(root):stack = []while stack or root:if root:print(root)stack.append(root.right)stack.append(root.left)else:tmp = stack.pop()# mid
def midIter(root):stack = []while stack or root:if root:stack.append(root)root = root.leftelse:tmp = stack.pop()print(tmp.value)root = tmp.right
#层次遍历
def traversal(root):pass
2. 测试一下是否可行
if __name__ == '__main__':root=Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'))))print('preTraverse:')preTraverse(root)print('midTraverse:')midTraverse(root)print('afterTraverse:')afterTraverse(root)
3.已知前序中序遍历,求后续遍历
def findTree1(preList, midList, afterList1):'''wrong program''''if len(preList) == 0:returnif len(preList) == 1:afterList1.append(preList[0])return root = preList[0]n = midList.index(root)findTree1(preList[1:n+1], midList[:n], afterList1)findTree1(preList[n+1:], midList[n+1:], afterList1)afterList1.append(root)def findTree2(preList, midList, afterList2):if len(preList) == 0:returnif len(preList) == 1:afterList2.append(preList[0])returnroot = preList[0]n = midList.index(root)findTree2(preList[1:n + 1], midList[:n], afterList2)findTree2(preList[n + 1:], midList[n + 1:], afterList2)afterList2.append(root)
if __name__ == '__main__':preList = list('12473568')midList = list('47215386')afterList1 = []afterList2 = []findTree1(preList, midList, afterList1)findTree2(preList, midList, afterList2)print(afterList1)print(afterList2)
4.求二叉树的深度和宽度
def getMaxDepth(tree):if tree == None:return 0l = getMaxDepth(tree.left)r = getMaxDepth(tree.right)return max(l, r)+1
参考
- python: http://www.cnblogs.com/freeman818/p/7252041.html
- java:https://blog.csdn.net/u012428012/article/details/79089915
数据结构与算法(四):二叉树相关推荐
- 常考数据结构与算法:输出二叉树的右视图
题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
- java环形链表_数据结构和算法(四)Java实现环形链表
1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...
- 数据结构与算法之-----二叉树(一)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...
- 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树
[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树二叉树的创建,关系建立二叉树的创建 ...
- 数据结构与算法:二叉树专题
数据结构与算法:二叉树专题 前言 前提条件 基础知识 二叉树链式存储结构 二叉树中序遍历 二叉树层序遍历 常见编程题 把一个有序整数数组放到二叉树中 逐层打印二叉树结点数据 求一棵二叉树的最大子树和 ...
- 数据结构与算法练习-二叉树中序遍历
python数据结构与算法练习-二叉树中序遍历 二叉树中序遍历 思路 python实现 二叉树中序遍历 链接: link. 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 样例 输入:ro ...
- 【数据结构与算法】二叉树
树 1.树.二叉树 2.二叉查找树 3.平衡二叉树.红黑树 4.递归树 一.树 1.树的常用概念 根节点.叶子节点.父节点.子节点.兄弟节点,还有节点的高度.深度以及层数,树的高度. 2.概念解释 节 ...
- 数据结构与算法之-----二叉树(二)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...
最新文章
- 在Ubuntu 14.04 64bit上编译并研究State Threads网络线程库源码
- mybatis转义反斜杠_mybatis like 的坑
- mysql远程连接 Host * is not allowed to connect to this MySQL server
- 收益 or 挑战?Serverless 究竟给前端带来了什么
- UDP socket 设置为的非阻塞模式
- 【2018ACM山东省赛 - C】Cities(最小生成树变形优化,贪心思维)
- 人脸检测算法_腾讯已开源高精度人脸检测算法DSFD
- linux ssh端口是否打开,如何查看linux中的ssh端口开启状态
- [Java] 蓝桥杯ALGO-152 算法训练 8-2求完数
- 23解析函数的级数表示(二)
- java 可重入锁 clh_Java可重入锁原理
- 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
- 李炎恢老师的php源码以及附带一个php手册
- 基于spring boot的Java开源商城系统(附完整版源码)
- 机器狗病毒样本 穿透冰和点还原卡
- python画螺旋状图形教程_如何快速绘制一个“螺旋状”图形?
- c语言一元多项式求和
- mysql按照音序排列_什么是按音序排列?
- Oracle trace level
- 拿到天使投资是一种怎样的体验