欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

完全二叉树

时间:2024-06-21 10:45 作者:admin 点击:
完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都被完全填满,并且最后一层的节点尽可能地集中在左侧。完全二叉树可以使用指针和数组两种方式来实现。 使用指针实

完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都被完全填满,并且最后一层的节点尽可能地集中在左侧。完全二叉树可以使用指针和数组两种方式来实现。

使用指针实现完全二叉树

使用指针实现完全二叉树时,每个节点包含数据和两个指向子节点的指针。

#include <iostream>

struct TreeNode {
    int value;
    TreeNode *left, *right;

    // 构造函数
    TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};

// 构建完全二叉树的示例
TreeNode* buildCompleteBinaryTree() {
    // 构建示例完全二叉树
    //       1
    //      / \
    //     2   3
    //    / \
    //   4   5
    TreeNode *root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);

    return root;
}

// 释放完全二叉树占用的内存
void deleteTree(TreeNode* node) {
    if (node) {
        deleteTree(node->left);
        deleteTree(node->right);
        delete node;
    }
}

使用数组实现完全二叉树

使用数组实现完全二叉树时,可以利用数组的索引特性来简化子节点的访问。

#include <vector>
#include <iostream>

class CompleteBinaryTree {
private:
    std::vector<int> tree;

public:
    // 构造函数,初始化空的完全二叉树
    CompleteBinaryTree() {}

    // 插入节点
    void insert(int value, int level, int index) {
        if (level >= (int)tree.size()) {
            tree.resize((level + 1) * 2, 0); // 确保数组足够大
        }
        tree[level * 2 + index] = value; // 插入值
    }

    // 打印树的层序遍历
    void printLevelOrder() {
        for (int i = 0; i < tree.size(); ++i) {
            std::cout << tree[i] << " ";
        }
        std::cout << std::endl;
    }

    // 释放数组占用的内存(vector会自动管理内存,这里仅为示例)
    ~CompleteBinaryTree() {
        tree.clear();
    }
};

// 构建完全二叉树的示例
void buildCompleteBinaryTreeArray(CompleteBinaryTree& cbt) {
    // 构建示例完全二叉树
    // 假设level为层,index为该层的索引
    cbt.insert(1, 0, 0); // 根节点
    cbt.insert(2, 1, 0); // 第一层,第一个节点
    cbt.insert(3, 1, 1); // 第一层,第二个节点
    cbt.insert(4, 2, 0); // 第二层,第一个节点
    cbt.insert(5, 2, 1); // 第二层,第二个节点
}

int main() {
    CompleteBinaryTree cbt;
    buildCompleteBinaryTreeArray(cbt);
    cbt.printLevelOrder(); // 打印层序遍历结果

    return 0;
}

在数组实现中,我们使用levelindex来确定节点在数组中的位置。level表示节点所在的层,index表示在该层中的索引。数组中的每个元素可以看作是一个节点,数组的索引可以转换为层和索引。

请注意,数组实现的完全二叉树通常需要预先知道树的最大高度,以便分配足够大的数组。在实际应用中,数组的大小可以根据需要动态调整。


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%