Нахождение maxdepth в бинарном дереве поиска - PullRequest
1 голос
/ 14 июня 2011

Вот код бинарного дерева поиска

#include<stdio.h>
#include<conio.h>
#include"malloc.h"

struct node
{
    int data;
    struct node* left;
    struct node* right;
};
int size(struct node* n)
{
    if(n==NULL)
       return 0;
    else
       return (size(n->left)+1+size(n->right));
}

int maxdepth(struct node* n)
{
    int ldepth,rdepth;
    if(n==NULL)
    {
       return 0;
    }
    else
    {
       ldepth=maxdepth(n->left);
       rdepth=maxdepth(n->right);
       if(ldepth>rdepth)
          return (ldepth+1);
       else
          return (rdepth+1);
    }
}

int lookup(struct node* node,int target)
{
    if(node==NULL)
       return 0;
    else if(target==node->data)
       return 1;
    else if(target<node->data)
       return(lookup(node->left,target));
    else
       return(lookup(node->right,target));
}

struct node* newnode(int data)
{
     struct node* newnod=(struct node*)malloc(sizeof(struct node));
     newnod->data=data;
     newnod->left=NULL;
     newnod->right=NULL;
     return newnod;
}

struct node* insert(struct node* root,int target)
{
    if(root==NULL)
        return(newnode(target));
    else if(target<=root->data)
        root->left=insert(root->left,target);
    else 
        root->right=insert(root->right,target);
    return root;
}

void main()
{
    int result,s,max;
    struct node* newnode=NULL;
    clrscr();
    newnode=insert(newnode,2);
    newnode=insert(newnode,3);
    newnode=insert(newnode,4);
    max=maxdepth(newnode);
    printf("maxdepth %d\n",max);
    s=size(newnode);
    result=lookup(newnode,3);
    printf("size %d\n",s);
    printf("%d",result);
    getch();
}

Когда я запускаю эту программу.Я получаю maxdepth имеет 3.

Если я изменю функцию maxdepth на

int maxdepth(struct node* n)
{
    int ldepth,rdepth;
    if(n==NULL)
    {
        return 0;
    }
    else
    {
        ldepth=maxdepth(n->left);
        rdepth=maxdepth(n->right);
        if(ldepth>rdepth)
            return (ldepth);
        else
            return (rdepth);
    }
}

, я получу значение maxdepth как 0. В чем проблема?Я не мог не понять это?

Ответы [ 2 ]

6 голосов
/ 14 июня 2011

Вы не считаете текущий узел, поэтому требуется +1.

      {
        ldepth = maxdepth(n->left);
        rdepth = maxdepth(n->right);

        if(ldepth > rdepth)
          return ldepth + 1;
        else
          return rdepth + 1;
      }

Без +1 maxdepth всегда будет возвращаться 0. Потому что ldepth и rdepth всегда будут 0.

Пример дерева с 3 узлами:

   A
 /   \
B     C

Теперь вы позвоните maxdepth(A), это будет делать: ldepth = maxdepth(B); rdepth = maxdepth(C);, затем maxDepth(B) сделает: ldepth = maxdepth(null); rdepth = maxdepth(null); /* ldepth and rdepth are now 0 */, поэтому maxDepth(B) вернется в результате 0. Похожий maxDepth(C) вернет 0. Вы будете делать тогда:

if(ldepth > rdepth)
  return ldepth;
else
  return rdepth;

Но оба ldepth и rdepth равны 0, поэтому будет возвращено rdepth, равное 0. Наконец maxdepth(A) вернет 0 в результате.

Вот почему +1 необходим.

5 голосов
/ 14 июня 2011

Давайте посмотрим на дерево примеров:

    __A__
   /     \
  B       C
 / \     / \
D   E   F   G

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

Какая высота дерева? Это высота A.

Какая высота A? Это один плюс высота B.

В свою очередь, высота B равна единице плюс высота D, а высота D равна единице плюс высота левой ветви D, которая равна нулю.

Итак, общая высота 1 + 1 + 1 + 0 = 3.

Таким образом, алгоритм в этом (упрощенном) случае:

def height (node):
    if node is null:
        return 0
    return 1 + height (node.left)

И , поэтому , поэтому ваша рекурсивная функция высоты должна добавлять по одному на каждом уровне. Если вместо этого вы добавляете 0 (что и делает ваш второй сегмент кода), вы переключаетесь с получения 1 + 1 + 1 + 0 = 3 на получение 0 + 0 + 0 + 0 = 0.

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

def height (node):
    if node is null:
        return 0
    leftheight = height (node.left)
    rightheight = height (node.rigth)
    return 1 + max (leftheight, rightheight)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...