シーケンシャルストレージで構築されたバイナリツリーは、チェーンストレージバイナリツリーに変換されます。

二分木ノードの作成

class TreeNode
{
    
    
public:
    int value;              // 所对应的值
    TreeNode *left, *right; // 下一个结点的地址
    TreeNode(int val)
    {
    
    
        value = val;
        left = nullptr;
        right = nullptr;
    }
    ~TreeNode()
    {
    
    
        delete right;
        delete left;
    }
};

シーケンシャルストレージで構築されたバイナリツリーは、チェーンストレージバイナリツリーに変換されます。

バイナリ ツリーの左側のサブツリーと左側のサブツリーの間の関係によると、ルート ノードのシリアル番号は次のようになります。

  • ルートノードのシリアル番号: i
  • 左側のサブツリーのルート ノードの番号: i*2+1
  • 右サブツリーのルートノード番号: i*2+2

上記の関係は、順次ストレージ内の配列にあります。

ステップ:

  • バイナリツリーのノードとルートノードを格納する配列を作成します
  • 二分木ノードの配列を初期化します。
  • ルートノードと左右の子のシリアル番号との関係に基づいて、仮パラメータの数値配列を構築し、リンクされたストレージバイナリツリーに変換します。
class BinaryTree
{
    
    
public:
    // 将顺序存储的二叉树转换成链式存储的二叉树
    static TreeNode *construct_BinaryTree(vector<int> nums)
    {
    
    
        // 创建存储二叉树结点的数组和根节点
        TreeNode *root = nullptr;
        vector<TreeNode *> vecTree(nums.size(), nullptr);

        // 初始化二叉树数组
        for (int i = 0; i < nums.size(); i++)
        {
    
    
            // 如果数组元素值不为-1则设置结点值
            TreeNode *node = nullptr;
            if (nums[i] != -1)
            {
    
    
                node = new TreeNode(nums[i]);
            }
            vecTree[i] = node;

            // 如果是根节点则更新root的值
            if (i == 0)
            {
    
    
                root = node;
                /* code */
            }
        }

        // 将存储二叉树子结点的数组转换成链式存储,
        for (int i = 0; i * 2 + 1 < vecTree.size(); i++)
        {
    
    
            if (vecTree[i * 2 + 1] != nullptr)
            {
    
    
                vecTree[i]->left = vecTree[i * 2 + 1];
                if (i * 2 + 2 < vecTree.size())
                {
    
    
                    /* code */
                    vecTree[i]->right = vecTree[i * 2 + 2];
                }
            }
        }

        // 返回链式存储的二叉树根节点
        return root;
    }

    // 前序遍历
    static void PreTaverse(TreeNode *node)
    {
    
    
        if (node == nullptr)
        {
    
    
            return;
        }
        // 输出节点的值
        cout << node->value << "\t";
        // 访问左子树
        PreTaverse(node->left);
        // 访问右子树
        PreTaverse(node->right);
    }
    // 中序遍历
    static void MidTaverse(TreeNode *node)
    {
    
    
        if (node == nullptr)
        {
    
    
            return;
        }

        // 访问左子树
        MidTaverse(node->left);
        // 输出节点的值
        cout << node->value << "\t";
        // 访问右子树
        MidTaverse(node->right);
    }
    // 后序遍历
    static void BackTaverse(TreeNode *node)
    {
    
    
        if (node == nullptr)
        {
    
    
            return;
        }

        // 访问左子树
        BackTaverse(node->left);

        // 访问右子树
        BackTaverse(node->right);

        // 输出节点的值
        cout << node->value << "\t";
    }
};

トラバーサル出力テスト

バイナリ ツリーでトラバーサル メソッドを使用して、変換されたリンク ストレージ バイナリ ツリーを検証します。

int main(int argc, char const *argv[])
{
    
    
    // 二叉树的数值数组
    vector<int> nums = {
    
    1, 2, 3, 4, 5, 6, 7};

    TreeNode *root = BinaryTree::construct_BinaryTree(nums);
    // 遍历输出
    cout << "先序遍历:";
    BinaryTree::PreTaverse(root);
    cout << endl;

    cout << "中序遍历:";
    BinaryTree::MidTaverse(root);
    cout << endl;

    cout << "后序遍历:";
    BinaryTree::BackTaverse(root);
    cout << endl;

    return 0;
}

出力結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44848852/article/details/127456681