2013-09-17 2 views
0

Свойство Childer Sum говорит, что для каждого узла значение данных должно быть равно сумме значений данных в левом и правом дочерних элементах. Я реализовал рекурсивную функцию, которая проверяет, удовлетворяет ли бинарное дерево свойству. Но код возвращает 1 для каждого дерева. Помогите и сообщите, есть ли что-то не так с логикой? :) Вот функцияПроверка наличия сумм детей в двоичном дереве

int child_sum(struct tree *node) 

    { 
     if(node==NULL) 
     { 
      return 0; 

     } 

if(node->left!=NULL && node->right!=NULL) 
     { 
     if(node->data=node->left->data+node->right->data) 
     { 
     return 1; 
     } 
     } 

    return child_sum(node->left) && child_sum(node->right); 
} 

ответ

0

if(node->data=node->left->data+node->right->data) должен быть if(node->data==node->left->data+node->right->data)

== Примечание. В вашем случае это было назначение (=), которое всегда было правдой.

+0

о да, я не видел! Благодаря :) – user2456752

0

Вот моя реализация двоичного дерева, которое содержит метод childrenSum.

struct BTree 
{ 
    struct NodeTree 
    { 
     NodeTree (int in) : data(in) { left = nullptr; right = nullptr;} 
     NodeTree* left; 
     NodeTree* right; 
     int data; 
    }; 

    NodeTree* head; 


    BTree(std::initializer_list<int> inList) 
    { 
     head = nullptr; 
     for (auto elem : inList) 
     { 
      NodeTree* nodeTree = new NodeTree(elem); 
      insert(nodeTree); 
     } 
    } 

    void insert(NodeTree* newElem) 
    { 
     if (head == nullptr) 
     { 
      head = newElem; 
      return; 
     } 
     insert2End(head, newElem); 
    } 

    void insert2End(NodeTree* current, NodeTree* newElem) 
    { 
     std::deque<NodeTree*> queue; 
     queue.push_back(current); 
     NodeTree* lastElem = nullptr; 
     while (!queue.empty()) 
     { 
      lastElem = queue.front(); 
      queue.pop_front(); 
      if (lastElem->left) 
       queue.push_back(lastElem->left); 
      else 
      { 
       lastElem->left = newElem; 
       break; 
      } 

      if (lastElem->right) 
       queue.push_back(lastElem->right); 
      else 
      { 
       lastElem->right = newElem; 
       break; 
      } 
     } 
    } 


    int postOrderTreeTraverser(NodeTree* in) 
    { 
     int totalSum = 0; 
     if (in->left) 
      totalSum += postOrderTreeTraverser(in->left); 
     if (in->right) 
      totalSum += postOrderTreeTraverser(in->right); 

     int returnVal = in->data; 
     if (in->left != nullptr || in->right != nullptr) 
      in->data = totalSum; 

     return returnVal; 

    } 



    void childrenSum() 
    { 
     if (head == nullptr) 
     { 
      return; 
     } 
     postOrderTreeTraverser(head); 
    } 

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