📅  最后修改于: 2023-12-03 14:39:35.950000             🧑  作者: Mango
在BST中,节点的数量取决于树中插入的元素数量。BST是一种二叉树数据结构,其中每个节点最多有两个子节点:左子节点和右子节点。在每个节点中,存储一个关键字和一个值,且它们按照关键字的大小(元素的大小)排列在树中。
在C++中,可以使用指针来实现BST。也可以通过递归来实现BST的节点数,具体如下:
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
int CountNodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
return CountNodes(root->left) + CountNodes(root->right) + 1;
}
上面的代码中,CountNodes函数采用递归的方式实现BST节点数的计算。它采用的是后序遍历算法,即在计算一个节点的时候先计算它的左子树和右子树,最后再计算它本身。因此,最后的节点个数就是所有节点个数的和加1。
当BST很大时,上述代码可能会爆栈,因此,也可以采用非递归的方式来实现BST节点数的计算。代码如下:
int CountNodesIter(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int count = 0;
std::stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
count++;
if (node->left != nullptr) {
s.push(node->left);
}
if (node->right != nullptr) {
s.push(node->right);
}
}
return count;
}
上述代码中,CountNodesIter函数采用非递归的方式实现BST节点数的计算。它使用了一个栈数据结构,将树的节点一个一个地压入栈中,并不断地弹出栈顶元素。在弹出每个节点之前,先将它的左子节点和右子节点分别压入栈中。因此,最后栈中的元素个数就是对应BST的节点个数。
总结:BST节点数的计算可以采用递归和非递归两种方式。递归的实现方式简单易懂,但当BST很大时,可能会爆栈。而非递归的实现方式则可以解决这个问题,但实现起来要稍微复杂一些。