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)

 

posted @ 2020-06-12 07:28  大碗炸酱面  阅读(100)  评论(0编辑  收藏  举报