2015-07-13 10 views
0

Я пытался решить проблему в дереве, И застрял в рекурсии и написал код. Но я не могу понять, почему он это дает! кто-то поможет, как код дает этот выход Моя программа х = 0, у = 0Рекурсия в двоичном дереве

int height1(node *root,int x,int y) 

{ 

int val; 

    if(root==NULL) 
    return 1; 
    else 
    { 
     x=x+height1(root->left,x,y); 
     y=y+height1(root->right,x,y); 
     printf("x=%d and y=%d %d\n",x,y,root->data); 
     if(x>y) 
      return x; 
      else 
       return y; 
    } 

это просто грубая работа, чтобы понять поток рекурсии. Ввод дерева траверса 50 40 70 45 30 44 48 и значение

 x y root->data 
     1 1 30 
     2 1 44 
     4 1 48 
     3 4 45 
     1 4 40 
     5  1 70 
     4 5  50 

, почему это происходит в этом случае, на моем пути он должен добавить у и х каждый раз, так что значение должно увеличиваться,

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

Я понимаю, что для определения базового состояния важно, и я знаю его, как найти. Но не могу понять, как это произошло.

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

Должен ли я обратиться к какой-либо книге, или я должен просто решить некоторые программы. Так что, пожалуйста, я хочу ваш совет, чтобы я мог стать хорошим в этом.

+0

это было бы намного проще понять, если вы по крайней мере объяснили, что это (неполный) код должен делать – Paul

+0

Это просто грубый код, чтобы получить поток программы , когда я пытался получить высоту дерева и застрял, чтобы понять, что написал этот грубый код. –

ответ

1

Этот код имеет довольно странную архитектуру в целом. Вы можете оставить два аргумента int, они бесполезны. Следующая проблема: этот код не учитывает ни одного узла, кроме листьев. И этот код имеет и некоторые логические ошибки (пример: if(root == NULL) return 1; приведет к подсчету узлов, которые даже не существуют). В целом это может быть реализовано намного проще:

int height1(node *root){ 
    if(root == NULL) 
     return 0; 

    int l = height1(root->left); 
    int r = height1(root->right); 

    return (l < r ? r : l) + 1; 
} 
+0

Да, я знаю, что в аргументе функции нет необходимости, и я могу определить их где-нибудь еще, Но ваш код и мой будут давать тот же результат :), если да, то как? –

+0

@SachinGodara нет, я так не думаю, хотя этот код даст правильный результат. В общем случае утверждение print довольно запутанно, так как узлы печатаются от листьев до корня. Я не думаю, что это приведет к тому же результату. На самом деле я все еще пытаюсь понять, как x и y в вашем коде действительно могут получить больше, чем 1 – Paul

+0

. Я возвращаю значение, которое больше, и добавляю его к предыдущим значениям x и y., И это то, что я хочу знать что как этот код дает этот ответ. –

Смежные вопросы