21xrx.com
2025-04-17 14:10:46 Thursday
文章检索 我的文章 写文章
如何在c++中存储平衡二叉树
2023-07-05 02:37:51 深夜i     13     0
平衡二叉树 存储方式 C++ AVL树 红黑树

平衡二叉树是一种非常重要的数据结构,它能够在O(log n)的时间内完成插入、删除和查找操作。在c++中,我们可以使用指针来实现平衡二叉树的存储。

首先我们需要定义平衡二叉树的节点结构,一个节点包括value、left、right、height四个属性,其中value是节点的值,left和right是指向左右子节点的指针,height表示以当前节点为根节点的子树的高度。代码如下:

struct Node{
  int value;
  Node *left;
  Node *right;
  int height;
};

然后我们需要实现一个函数来计算节点的高度,该函数的实现方法是在该节点的左右子树中选择高度更大的一个,然后在该基础上加上1,表示该节点自身的高度。代码如下:

int getHeight(Node *n){
  if (n == NULL)
    return -1;
  
  return max(getHeight(n->left), getHeight(n->right)) + 1;
}

接下来我们需要实现一个函数来判断一个节点是否平衡,其实现方法是比较该节点的左右子树的高度差是否大于1,如果大于1,那么该节点就不平衡。代码如下:

bool isBalanced(Node *n){
  if (n == NULL)
    return true;
  
  int balanceFactor = abs(getHeight(n->left) - getHeight(n->right));
  if (balanceFactor > 1)
    return false;
  
  return isBalanced(n->left) && isBalanced(n->right);
}

最后我们需要实现节点的旋转操作,以保证平衡二叉树始终是平衡的。旋转操作包括左旋和右旋两种,左旋可以将一个节点的右子树转移到该节点的左子树,右旋可以将一个节点的左子树转移到该节点的右子树。代码如下:

Node* leftRotate(Node *n){
  Node *newRoot = n->right;
  n->right = newRoot->left;
  newRoot->left = n;
  n->height = max(getHeight(n->left), getHeight(n->right)) + 1;
  newRoot->height = max(getHeight(newRoot->left), getHeight(newRoot->right)) + 1;
  return newRoot;
}
Node* rightRotate(Node *n){
  Node *newRoot = n->left;
  n->left = newRoot->right;
  newRoot->right = n;
  n->height = max(getHeight(n->left), getHeight(n->right)) + 1;
  newRoot->height = max(getHeight(newRoot->left), getHeight(newRoot->right)) + 1;
  return newRoot;
}

以上是在c++中存储平衡二叉树的方法和实现,使用指针存储平衡二叉树可以更高效地实现插入、删除和查找操作。如果您需要使用平衡二叉树解决问题,希望这篇文章对您有所帮助。

  
  

评论区

    相似文章
请求出错了