C ++使用数组结构创建平衡二进制搜索树

时间:2018-05-06 14:54:21

标签: c++ vector data-structures binary-search-tree nodes

的任务是在向量中存储二叉树。在每个节点中存储一个int ID,int Age和一个字符串名称。

节点通过ID在矢量中存储和组织。

在向量中存储二叉树时,我使用算法2i和2i + 1分别指示节点的左右孩子。

我设法创建了一个插入方法,我相信满足这些条件,但是出于某种原因,当试图打印我的向量的值时,我似乎得到负值。对于此特定示例,我插入以下值

100 21 Stan

50 30菲尔

我尝试放置另一个节点

30 31爱丽丝

根据消息来源,会导致树变得不平衡。

所以我试图使用存储在向量中的节点创建一个平衡的二叉搜索树。以前我使用以前的插入结构创建了一个不平衡的树。但是,我并不完全了解平衡二叉搜索树是什么

所以我的问题如下:

  1. 什么是平衡二叉搜索树?

  2. 您建议我应该更改插入功能以鼓励创建平衡树?

  3. 提前致谢!

    这是我的代码:

    #include "BinaryTree.h"
    #include <string>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    int index = 0;
    
    struct Node
    {
        int ID = -1;
        int age = -1;
        string name = "";
    
        Node()
        {
    
    
        }
    
        Node(int id, int Age, string nm)
        {
            this->ID = id;
            this->age = Age;
            this->name = nm;
        }
    };
    
    vector<Node> binaryTree;
    
    
    BST::BST()
    {
    
    }
    
    
    
    
    
    void BST::insert()
    {
        unsigned int ID;
        int AGE;
        string NAME;
        int root = 0;
    
        bool success = false;
        cout << "Please enter the ID number, age and name:" << endl;
    
    
        cin >> ID >> AGE >> NAME;
    
        Node *tree = new Node(ID, AGE, NAME);
    
    
    
        if (!binaryTree.empty())
        {
            do
            {
                if (tree->ID > binaryTree.at(root).ID && binaryTree.at(root).ID != 0)
                {
                    root = 2 * root + 2;
                    if (root >= binaryTree.size()) binaryTree.resize((2 * root + 2 + 1) * 5);
    
                }
    
                if (tree->ID < binaryTree.at(root).ID && binaryTree.at(root).ID != 0)
                {
                    root = 2 * root + 1;
                    if (root >= binaryTree.size()) binaryTree.resize((2 * root + 2 + 1) * 5);
    
                }
    
                if (binaryTree.at(root).ID == -1)
                {
                    binaryTree[root] = *tree;
                    success = true;
                }
            } while (!success);
        }
    
        if (binaryTree.empty())
        {
            binaryTree.push_back(*tree);
        }
    
        delete tree;
    
    }
    

1 个答案:

答案 0 :(得分:1)

我会使用heap,这是平衡二叉树的最极端形式(数组中的所有索引必须是完整的,才能使用下一个)。

您使用的2i2i+1算法应该可以正常工作(请记住不要使用0索引)。

要插入,您可以执行以下操作:

1)在数组中第一个未使用的索引处添加新元素。

2)使用upheap算法。这种方法的工作方式是将元素与其父元素进行比较,并根据树的属性进行交换(例如,如果子元素>父元素,则在最大堆中)。您以递归方式执行此操作,直到树的根(索引1)。这需要O(log n)时间。

这应该为您提供一个完美平衡的二叉树和数组实现。