平衡二叉树(AVL Tree)[一]概念与C构建

平衡二叉树 - AVL Tree

    • 专业术语(Terminology)
    • 平衡二叉树的定义
    • C构建代码
    • Reference


专业术语(Terminology)

  • 根结点(Root Node): 一棵(子)树中最顶端的结点
  • 父结点(Parent): 子结点的上一层的结点
  • 叶结点(Leaf Node): 没有子结点的结点
  • 内部结点(Internal Node):至少有一个子结点的结点
  • 度(Degree):连接该结点的子树数量
  • 深度(Depth): 该结点的前辈(parent、grandparent)数量
  • 高度(Height): 子树中某结点最大的深度
  • 层次(Level):从根结点起,根为第1层,子结点为第2层,往下递增。

P.S. 对于高度和深度,不同的教材可能有不同的定义
平衡二叉树(AVL Tree)[一]概念与C构建_第1张图片

上图中

  • A为整棵树的根结点。
  • A的度数为3,因为A有3棵子树。
  • B是E的父结点,E是B的子结点。
  • C是一个叶结点,因为它没有子结点;D是一个内部结点,因为有一个子结点。
  • F的深度为2,因为F有2个前辈(parent: B & grandparent: A)。
  • A的高度为2,因为其子树的结点中的高度(B = 1 / E = 2 / F = 2 / G =2),取最大值2。
  • 整棵树的层次为3。

注意:这不是一棵平衡二叉树。 二叉树的结点中最多存在两个子结点,而B有3个子结点,所以不是平衡二叉树(AVL Tree)。这里是想要通过这张图来说明树的专业术语。


平衡二叉树的定义

  • 二叉树:每个结点最多只能有两棵子树(左子树(left subtree)和右子树(right subtree))
  • 平衡:所有子结点的高度差 <= 1

平衡二叉树的优点是:增删改查的时间复杂度都可以实现O(log n),相对于线性数据结构来说性能更好。


C构建代码

// 定义树的结点
typedef struct AVLTreeNode {
	int key;  
	int value; 
	int height;  // height of the subtree rooted at this node
	struct AVLTreeNode *parent;  // pointer to parent
	struct AVLTreeNode *left;  // pointer to left child
	struct AVLTreeNode *right;  // pointer to right child
} AVLTreeNode;

// 定义AVL树
typedef struct AVLTree{
	int size;  // count of items in avl tree
	AVLTreeNode *root;  // root
} AVLTree;

Reference

[1] 程杰.大话数据结构[M].北京.清华大学出版社,2011:150-154.

你可能感兴趣的:(数据结构)