6.二叉树
树(Tree)的基本概念
- 节点,根节点,父节点,子节点,兄弟节点
- 一棵树可以没有任何节点,称为空树
- 一棵树可以只有1个节点,也只有根节点
- 子树,左子树,右子树
- 节点的度(degree):子树的个数
- 树的度:所有节点度中的最大值
- 叶子节点(leaf):度为0的节点
- 节点的深度(depth):从根节点到当前节点的唯一路径的节点总数
- 节点的高度(height):从当前节点到最远叶子节点的路径上的节点总数
二叉树(Binary Tree)
二叉树的特点
- 每个节点的度最大为2(最多拥有2棵子树)
- 左子树和右子树是有顺序的
- 即使某节点只有一颗子树,也要区分左右子树
- 非空二叉树的第i层,最多有2i-1个节点
- 在高度为h的二叉树上最多有2h-1个节点
- 对于任何一颗非空二叉树,如果叶子节点个数为n0,度为2的节点个数为n2,则有n0=n2+1
真二叉树(Proper Binary Tree)
所有节点的度要么为0,要么为2
满二叉树(Full Binary Tree)
所有节点的度要么为0,要么为2,且所有的叶子节点都在最后一层
- 在同样高度的二叉树中,满二叉树的叶子节点数量最多,总节点数最多
- 满二叉树一定是真二叉树,真二叉树不一定是满二叉树
完全二叉树(Complete Binary Tree)
所有叶子节点只会出现最后2层,且最后1层的叶子节点都靠左对齐
- 度为1的节点只有左子树
- 度为1的节点要么是1个,要么是0个
- 同样节点的数量的二叉树,完全二叉树的高度最小
- 假设完全二叉树的高度为h,那么至少有2h-1个节点,最多有2h-1个节点
总节点数为n
- 2h-1=< n < 2h
- h-1 = < log2n <h
- h=floor(log2n)+1 //floor是向下取整,另外,ceiling是向上取整
一棵有n个节点的完全二叉树(n>0),从上到下,从左到右对节点从1开始进行编号,对任意的第i个节点
- 如果i=1,它是根节点
- 如果i>1,它的父节点编号为floor(i/2)
- 如果2i=<n,它的左子节点编号为2i
- 如果2i>n,它没有左子节点
- 如果2i+1=< n,它的右子节点编号为2i+1
- 如果2i+1,它无右子节点
二叉树代码实现
#前序 def preorder(self,root): if root: self.traverse_path.append(root.val) self.preorder(root.left) self.preorder(root.right) #中序 def inorder(self,root): if root: self.preorder(root.left) self.traverse_path.append(root.val) self.preorder(root.right) #后序 def postorder(self,root): self.preorder(root.left) self.preorder(root.right) self.traverse_path.append(root.val)