Проблема преобразования двоичного дерева в потоковое двоичное дерево - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу преобразовать двоичное дерево в потоковое двоичное дерево.это мой алгоритм и код для конвертации.но я получаю ошибку "Исключение типа 'System.StackOverflowException' было сгенерировано."

   public void ConvertToTBT(Node r, int[] inorder)
    {
        for (int i = 0; i < inorder.Length; i++)
        {
            Node temp = Search(r, inorder[i]);

            if (i <= inorder.Length - 2)
                if (temp.rightChild == null)
                {
                    temp.rightChild = Search(r, inorder[i + 1]);
                    temp.is_right_thread = true;
                }
            if (i != 0)
                if (temp.leftChild == null)
                {
                    temp.leftChild = Search(r, inorder[i - 1]);
                    temp.is_left_thread = true;
                }

        }
    }

, и это метод поиска (который находит узел и возвращает его), который я нашел здесь и использую в своем коде

public Node Search(Node root, int data)
    {
        if (root != null)
        {
            if (root.data == data)
                return root;
            else
            {
                Node foundNode = Search(root.leftChild, data);
                if (foundNode == null)
                    foundNode = Search(root.rightChild, data);
                return foundNode;
            }
        }
        else
            return null;
    }

где я могу ошибиться?!

если у вас есть лучшая идея для преобразования BT в TBT, пожалуйста, помогите мне!

Обратите внимание, что мое деревоэто двоичный НЕ Бинарный поиск

также мой метод biuldTree

public Node BuildTree(int[] inorder, int[] preorder, int instart, int inend)
    {
        if (instart > inend)
            return null;
        if (preindex >= inorder.Length)
            return null;
        int pickedpre = preorder[preindex];
        preindex++;

        Node newnode = new Node(pickedpre);
        if (instart == inend)
            return newnode;

        for (int i = 0; i < inorder.Length; i++)
        {
            if (inorder[i] == pickedpre)
            {
                inindex = i;
                break;
            }
        }
        newnode.leftChild = BuildTree(inorder, preorder, instart, inindex - 1);
        newnode.rightChild = BuildTree(inorder, preorder, inindex + 1, inend);

        root = newnode;
        return newnode;
    }
...