Логическая ошибка BST… неправильные результаты

StackOverflow https://stackoverflow.com/questions/407579

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Почему я не могу найти _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);
                }

            }



        }

    }
}

Заранее спасибо и особая благодарность Марку Грэвеллу.

Это было полезно?

Решение

Если то, что вы имеете в виду в 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;   
}

Другие советы

Что касается получения высоты дерева, используйте следующий рекурсивный псевдокод, вызвав 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)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top