📜  链接完全二叉树及其创建(1)

📅  最后修改于: 2023-12-03 15:28:33.909000             🧑  作者: Mango

链接完全二叉树及其创建

简介

完全二叉树是一种特殊的二叉树,除了最底层的叶子节点,其他层的节点都是满的。而完全二叉树中,最后一层的叶子节点都集中在最左边的连续位置上,因此可以使用数组来存储。

链接完全二叉树是一种利用指针将完全二叉树的节点链接起来的方法,因此在访问节点时可以直接通过指针进行访问,无需使用数组。

定义

定义一个链接完全二叉树的结构体 Node,其中包含一个 value 节点值,一个 left_child 左儿子指针,和一个 right_child 右儿子指针。

struct Node {
    int value;
    Node* left_child;
    Node* right_child;
};
创建链接完全二叉树

首先需要得到一个完全二叉树的数组形式,假设数组为 arr,长度为 n。可以通过下标计算出一个节点在数组中的位置,假设节点下标为 i,则左儿子下标为 2*i+1,右儿子下标为 2*i+2

使用递归从根节点开始创建链接完全二叉树,假设根节点下标为 0。创建节点,递归创建左儿子和右儿子。当节点下标超过数组长度或节点值为 -1 时,返回节点指针 nullptr

Node* create_tree(int arr[], int n, int i) {
    if (i >= n || arr[i] == -1) {
        return nullptr;
    }
    Node* node = new Node{arr[i], nullptr, nullptr};
    node->left_child = create_tree(arr, n, 2*i+1);
    node->right_child = create_tree(arr, n, 2*i+2);
    return node;
}
示例

假设完全二叉树数组为 {1, 2, 3, 4, 5, -1, 7}。则下标为 0 的节点 1 的左儿子下标为 1,右儿子下标为2,对应 23。因此完全二叉树结构为:

          1
        /   \
       2     3
      / \     \
     4   5     7

使用 create_tree() 函数创建链接完全二叉树。

int arr[] = {1, 2, 3, 4, 5, -1, 7};
Node* root = create_tree(arr, 7, 0);
总结

链接完全二叉树是一种利用指针链接完全二叉树节点的方式,可以直接通过指针访问节点,而无需使用数组。通过递归创建链接完全二叉树可以快速生成链接完全二叉树。