📜  bst cpp 的节点数 - C++ (1)

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

BST的节点数 - C++

在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很大时,可能会爆栈。而非递归的实现方式则可以解决这个问题,但实现起来要稍微复杂一些。