Логическая ошибка BST ... неправильные результаты - PullRequest
1 голос
/ 02 января 2009

Привет, я сделал этот код с помощью Марка Гравелла в

Почему я не могу найти _left и _right в BinarySearchTree?
&
Как исправить ошибку неявного преобразования в коде BST C #?

, его бинарное дерево поиска, но теперь у меня логическая ошибка, что полученные результаты неверны, вывод моего кода следующий:

2
3
5
6
10
17
------------------------------------------------
17
2
------------------------------------------------
3                 
6
Press any key to continue . . .

последние два числа должны дать общее количество вставленных элементов 6, но его показ 9

а как же путь Как я могу получить высоту дерева?!


using System;
using System.Collections.Generic;
using System.Text;

namespace errors
{
    class Program
    {
        static void Main(string[] args)
        {
            BinarySearchTree t = new BinarySearchTree();

            t.insert(ref t.root, 10);
            t.insert(ref t.root, 5);
            t.insert(ref t.root, 6);
            t.insert(ref t.root, 17);
            t.insert(ref t.root, 2);
            t.insert(ref t.root, 3);

            BinarySearchTree.print(t.root);

            Console.WriteLine("------------------------------------------------");
            Console.WriteLine(t.FindMax());
            Console.WriteLine(t.FindMin());
            Console.WriteLine("------------------------------------------------");

            Console.WriteLine(t.CountLeaves(t.root));
            Console.WriteLine(t.CountNodes(t.root));

        }

        public class TreeNode
        {
            public int n;
            public TreeNode _left;
            public TreeNode _right;


            public TreeNode(int n, TreeNode _left, TreeNode _right)
            {
                this.n = n;
                this._left = _left;
                this._right = _right;
            }


            public void DisplayNode()
            {
                Console.Write(n);
            }


        }


        public class BinarySearchTree
        {
            public TreeNode root;


            public BinarySearchTree()
            {
                root = null;
            }


            public void insert(ref TreeNode root, int x)
            {
                if (root == null)
                {
                    root = new TreeNode(x, null, null);
                }
                else
                    if (x < root.n)
                        insert(ref root._left, x);
                    else
                        insert(ref root._right, x);
            }

            public int FindMin()
            {
                TreeNode current = root;

                while (current._left != null)
                    current = current._left;

                return current.n;
            }

            public int FindMax()
            {
                TreeNode current = root;

                while (current._right != null)
                    current = current._right;

                return current.n;
            }



            public TreeNode Find(int key)
            {
                TreeNode current = root;

                while (current.n != key)
                {
                    if (key < current.n)
                        current = current._left;
                    else
                        current = current._right;
                    if (current == null)
                        return null;
                }
                return current;
            }



            public void InOrder(ref TreeNode root)
            {
                if (root != null)
                {
                    InOrder(ref root._left);
                    root.DisplayNode();
                    InOrder(ref root._right);
                }
            }

            public int CountNodes(TreeNode root)
            {
                int count=1;
                if (root._left != null)
                    count += CountNodes(root._left);
                if (root._right != null)
                    count += CountNodes(root._right);
                return count;
            }

            public int CountLeaves(TreeNode root)
            {
                int count = (root._left == null && root._right == null) ? 1 : 0;
                if (root._left != null)
                    count += CountLeaves(root._left);
                if (root._right != null)
                    count += CountLeaves(root._right);
                return count;
            }


            public static void print(TreeNode root)
            {
                if (root != null)
                {
                    print(root._left);
                    Console.WriteLine(root.n.ToString());
                    print(root._right);
                }

            }



        }

    }
}

Большое спасибо заранее и особое спасибо Марку Гравеллу.

Ответы [ 3 ]

2 голосов
/ 02 января 2009

Если вы подразумеваете под CountNodes подсчет всех неконечных узлов, вы должны изменить эту строку:

int count=1;

читать это:

int count = (root._left == null && root._right == null) ? 0 : 1;

(противоположное тому, что есть в CountLeaves).

И это даст вам высоту дерева:

public int Height(TreeNode root)
{
    int height = 1;
    if (root._left != null)
        height = Math.Max(height, Height(root._left));
    if (root._right != null)
        height = Math.Max(height, Height(root._right));
    return height;   
}
0 голосов
/ 02 января 2009

Не похоже, что вы уравновешиваете свое дерево, поэтому вы просто получаете простой связанный список, который может учитывать ваши неверные значения. Правильно сбалансированное дерево будет иметь максимальную высоту log2 (n).

0 голосов
/ 02 января 2009

Что касается получения высоты дерева, используйте следующий рекурсивный псевдокод, вызывая nodeHeight(root):

nodeHeight(node)
    left=0
    right=0

    if (node == null) return 0

    left = 1 + nodeHeight(getLeft(node))
    right = 1 + nodeHeight(getRight(node))

    return max(left,right)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...