📜  门| GATE-CS-2005 |问题21(1)

📅  最后修改于: 2023-12-03 14:58:26.913000             🧑  作者: Mango

门 | GATE-CS-2005 | 问题21

这是一道《计算机科学与工程联合会-GATE-CS-2005》考试中的问题。考察的是程序员的算法和数据结构的基础知识,下面进行详细介绍。

问题描述

你的任务是实现一个二叉树数据结构,其中每个节点有一个整数值。你需要实现以下几个操作:

  • insert(i, j):在将节点 j 插入到值为 i 的节点的子树中
  • delete(i):删除值为 i 的节点及其子树
  • count(i):返回值为 i 的节点的数量
  • inrange(i, j):返回值在范围 ij 中的节点数量
解决方案

这里我们将使用 C++ 实现上述操作。我们将首先定义一个表示二叉搜索树节点的结构体:

struct Node {
  int val;
  Node* left;
  Node* right;
  Node(int x) : val(x), left(NULL), right(NULL) {}
};

然后,我们定义一个二叉搜索树类 BST,并实现上述操作:

class BST {
 public:
  BST();
  void insert(int target, int val);
  bool deleteNode(int target);
  int count(int target);
  int inrange(int start, int end);

 private:
  Node* root;
  Node* insert(Node* node, int target, int val);
  Node* deleteNode(Node* node, int target);
  Node* findMin(Node* node);
  Node* findMax(Node* node);
  int count(Node* node, int target);
  int inrange(Node* node, int start, int end);
};

对于 BST 类的构造函数和 insertdeleteNode 操作的实现,可以参考以下代码:

BST::BST() {
  root = NULL;
}

void BST::insert(int target, int val) {
  root = insert(root, target, val);
}

Node* BST::insert(Node* node, int target, int val) {
  if (node == NULL) {
    node = new Node(val);
  } else if (node->val > target) {
    node->left = insert(node->left, target, val);
  } else {
    node->right = insert(node->right, target, val);
  }
  return node;
}

bool BST::deleteNode(int target) {
  root = deleteNode(root, target);
  return root != NULL;
}

Node* BST::deleteNode(Node* node, int target) {
  if (node == NULL) {
    return NULL;
  } else if (node->val > target) {
    node->left = deleteNode(node->left, target);
  } else if (node->val < target) {
    node->right = deleteNode(node->right, target);
  } else if (node->left != NULL && node->right != NULL) {
    node->val = findMin(node->right)->val;
    node->right = deleteNode(node->right, node->val);
  } else {
    Node* temp = node;
    if (node->left == NULL) {
      node = node->right;
    } else if (node->right == NULL) {
      node = node->left;
    }
    delete temp;
  }
  return node;
}

Node* BST::findMin(Node* node) {
  while (node->left != NULL) {
    node = node->left;
  }
  return node;
}

Node* BST::findMax(Node* node) {
  while (node->right != NULL) {
    node = node->right;
  }
  return node;
}

countinrange 操作的实现,可以参考以下代码:

int BST::count(int target) {
  return count(root, target);
}

int BST::count(Node* node, int target) {
  if (node == NULL) {
    return 0;
  } else if (node->val > target) {
    return count(node->left, target);
  } else if (node->val < target) {
    return count(node->right, target);
  } else {
    return 1 + count(node->left, target) + count(node->right, target);
  }
}

int BST::inrange(int start, int end) {
  return inrange(root, start, end);
}

int BST::inrange(Node* node, int start, int end) {
  if (node == NULL) {
    return 0;
  } else if (node->val < start) {
    return inrange(node->right, start, end);
  } else if (node->val > end) {
    return inrange(node->left, start, end);
  } else {
    return 1 + inrange(node->left, start, end) + inrange(node->right, start, end);
  }
}
总结

本文中,我们已经介绍了二叉搜索树的实现方式,并提供了 C++ 代码,用来实现插入、删除、计数、范围查找等操作。如果你需要在你自己的程序中使用此类数据结构,现在你应该具备实现它的基本能力了。