2010-04-14 4 views
2

Как подсчитать количество правильных детей в двоичном дереве?Как подсчитать количество правильных детей в двоичном дереве?

Это означает, что я хочу, чтобы дети были отмечены как справа.

Ex.

(Left | Right) 

     F(Root)  
    G | H  
T U | I J 

Правильные дети будут U, H и J.

Что бы алгоритм, чтобы найти их.

+0

ли вы на самом деле означает «дети» или «правильных потомков» ? Потому что, если это первый, это либо будет 1 или 0. – polygenelubricants

ответ

6
int count(Tree *r){ 
    if(r == NULL) return 0; 
    int num_l=0, num_r=0; 
    if(r->left != NULL) 
     num_l = count(r->left); 
    if(r->right != NULL) 
     num_r = count(r->right)+1; 
    return num_l+num_r 
} 
+0

Вы не позаботились о случае ** r == NULL ** Если я передам NULL вашей функции, он сработает. – codaddict

+0

@unicornaddict: хорошая точка! – zsong

+0

Выглядит хорошо сейчас :) +1 – codaddict

1

В рекурсивном подходе

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

Это должно сработать.

0

Вы можете сделать это рекурсивно как:

  • Если дерево не существует, нет R детей.
  • Если дерево существует, то # R дети = # R дети в R-поддереве + # R детьми в L-поддереве

.

int countRChildren(Node *root) { 
     if(!root) // tree does not exist. 
      return 0; 

     // tree exists...now see if R node exits or not. 
     if(root->right) // right node exist 

      // return 1 + # of R children in L/R subtree. 
      return 1 + countRChildren(root->right) + countRChildren(root->left); 

     else // right nodes does not exist. 
      // total count of R children will come from left subtree. 
      return countRChildren(root->left); 
    } 
1

Простой обход дерева (то есть порядок по порядку), а для каждого узла - +1, если у него есть правильный ребенок.

Пример (не пытался скомпилировать и проверить его):

int countRightChildren(Node root) 
{ 
    if (root == null) return 0; 
    int selfCount = (root.getRightChild() != null) ? 1 : 0; 
    return selfCount + countRightChildren(root.getLeftChild()) + countRightChildren(root.getRightChild()); 
} 
0

Это включает, как я строить-структуру

struct Item 
{ 
    int info; 
    struct Item* right; 
    struct Item* left; 
}; 
typedef struct Item* Node; 

int countRightSons(Node tree) 
{ 
    if(!tree) 
    return 0; 
    if(tree->right != NULL) 
    return 1 + countRightSons(tree->right) + countRightSons(tree->left); 
    return countRightSons(tree->left); 
} 
Смежные вопросы