Как создать двоичное дерево

К сожалению, вы не можете создать экземпляр объекта, используя свойство, которое не является ключевым свойством. Свойство ключа в WMI - это свойство, которое имеет квалификатор CIM_Key , документация WMI более подробно описывает Key Qualifier . Для получения дополнительной информации о требовании WMI об использовании полного пути с ключом для ссылки на объект вы можете прочитать документацию WMI о Пути объекта экземпляра .

В C # для определенного класса, который вы указали (Win32_EncryptableVolume), вы можете выполнить то, что пытаетесь сделать, используя ManagementObjectSearcher, как показано в вашем примере. Это потому, что вы пытаетесь получить экземпляр на основе стандартного свойства, а не ключевого свойства.

Отличной утилитой для изучения WMI является WMI Explorer 2.0. Это дает отличное визуальное представление классов WMI. В этой утилите ключевые свойства помечены звездочкой.

https://github.com/vinaypamnani/wmie2/releases

5
задан Tom 14 May 2009 в 14:24
поделиться

4 ответа

Часть объявления древовидного класса, конечно же, не является проблемой. Вы в основном указали, как это объявлять, в вопросе:

class BinaryTree
{
private:
    int data;
    BinaryTree *left, *right;
};

Это поддерживает различные формы обхода, например так:

void Inorder(const BinaryTree *root)
{
  if(root == 0)
    return;
  Inorder(root->left);
  printf("now at %d\n", root->data);
  Inorder(root->right);
}

Вы должны иметь возможность вывести из этого обходы до и после заказа. В реальной реализации дерево, вероятно, будет иметь шаблон для хранения случайных данных, процедуры обхода будут более общими (с вводом пользовательских данных или, возможно, обратным вызовом для каждого узла, или чем-то еще), конечно.

1
ответ дан 18 December 2019 в 07:10
поделиться

If you're after source for a comprehensive BinaryTree implementation you can learn from have a look at The C5 Generic Collection Library.

0
ответ дан 18 December 2019 в 07:10
поделиться

Если я вас правильно понял, вы хотите создать двоичное дерево из массива

int[] values = new int[] {1, 2, 3, 4, 5};
BinaryTree tree = new BinaryTree(values);

, это должно предварительно заполнить двоичное дерево значениями 1–5 следующим образом:

    1
   / \
  2   3
 / \
4   5

это можно сделать с помощью следующего класса:

class BinaryTree
{
    int value;
    BinaryTree left;
    BinaryTree right;

    public BinaryTree(int[] values) : this(values, 0) {}

    BinaryTree(int[] values, int index)
    {
        Load(this, values, index);
    }

    void Load(BinaryTree tree, int[] values, int index)
    {
        this.value = values[index];
        if (index * 2 + 1 < values.Length)
        {
            this.left = new BinaryTree(values, index * 2 + 1);
        }
        if (index * 2 + 2 < values.Length)
        {
            this.right = new BinaryTree(values, index * 2 + 2);
        }
    }
}
20
ответ дан 18 December 2019 в 07:10
поделиться

Поскольку я не получил никаких ответов на заданный мной вопрос, я опубликую свою собственную реализацию двоичного дерева с использованием массивов. теперь я знаю, что реализация массива проще, чем я думал, но все же я не знаю, как реализовать то же самое, используя связанные списки.

код находится в C #

  class BinaryTree
    {
        private static int MAX_ELEM = 100;      //initial size of the array
        int lastElementIndex;
        int?[] dataArray;

        public BinaryTree()
        {
            dataArray = new int?[MAX_ELEM];
            lastElementIndex = -1;
        }

        //function to insert data in to the tree
        //insert as a complete binary tree
        public void insertData(int data)
        {
            int?[] temp;
            if (lastElementIndex + 1 < MAX_ELEM)
            {
                dataArray[++lastElementIndex] = data;
            }
            else
            {  //double the size of the array on reaching the limit
                temp = new int?[MAX_ELEM * 2];
                for (int i = 0; i < MAX_ELEM; i++)
                {
                    temp[i] = dataArray[i];
                }
                MAX_ELEM *= 2;
                dataArray = temp;
                dataArray[++lastElementIndex] = data;
            }
        }

        //internal function used to get the left child of an element in the array
        int getLeftChild(int index) {
            if(lastElementIndex >= (2*index+1))
                return (2*index + 1);
            return -1;
        }

        //internal function used to get the right child of an element in the array
        int getRightChild(int index) {
            if(lastElementIndex >= (2*index+2))
                return (2*index + 2);
            return -1;
        }
        //function to check if the tree is empty
        public bool isTreeEmpty() {
            if (lastElementIndex == -1)
                return true;
            return false;
        }

        //recursive function for inorder traversal
        public void traverseInOrder(int index) {
            if (index == -1)
                return;
            traverseInOrder(getLeftChild(index));
            Console.Write("{0} ", dataArray[index]);
            traverseInOrder(getRightChild(index));
        }

        //recursive function for preorder traversal
        public void traversePreOrder(int index) {
            if (index == -1)
                return;
            Console.Write("{0} ", dataArray[index]);
            traversePreOrder(getLeftChild(index));
            traversePreOrder(getRightChild(index));
        }

        //recursive function for postorder traversal
        public void traversePostOrder(int index) {
            if (index == -1)
                return;
            traversePostOrder(getLeftChild(index));
            traversePostOrder(getRightChild(index));
            Console.Write("{0} ", dataArray[index]);
        }

        //function to traverse the tree in level order
        public void traverseLevelOrder()
        {
            Console.WriteLine("\nPrinting Elements Of The Tree In Ascending Level Order\n");
            if (lastElementIndex == -1)
            {
                Console.WriteLine("Empty Tree!...press any key to return");
                Console.ReadKey();
                return;
            }
            for (int i = 0; i <= lastElementIndex; i++)
            {
                Console.Write("{0} ", dataArray[i]);
            }
            Console.WriteLine("\n");
        }


    }
1
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: