C 检查二叉树中的子项总和属性
Childer Sum属性表示,对于每个节点,数据值必须等于左、右子节点中的数据值之和。 我实现了一个递归函数,用于检查二叉树是否满足该属性。但是代码为每棵树返回1。 请帮助并说明逻辑是否有问题?:) 下面是函数C 检查二叉树中的子项总和属性,c,binary-tree,C,Binary Tree,Childer Sum属性表示,对于每个节点,数据值必须等于左、右子节点中的数据值之和。 我实现了一个递归函数,用于检查二叉树是否满足该属性。但是代码为每棵树返回1。 请帮助并说明逻辑是否有问题?:) 下面是函数 int child_sum(struct tree *node) { if(node==NULL) { return 0; } if(node->left!=NULL && node
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);
}
if(node->data=node->left->data+node->right->data)
应该是if(node->data==node->left->data+node->right->data)
注意
==
。在你的例子中,赋值(=
)总是正确的。这里是我对包含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);
}
};
structbtree
{
结构节点
{
NodeTree(int-in):数据(in){left=nullptr;right=nullptr;}
NodeTree*左;
NodeTree*对;
int数据;
};
NodeTree*头;
BTree(std::initializer\u列表中的列表)
{
水头=零PTR;
用于(自动元素:inList)
{
NodeTree*NodeTree=新的NodeTree(elem);
插入(nodeTree);
}
}
无效插入(NodeTree*newElem)
{
if(head==nullptr)
{
头=纽兰;
回来
}
插入2结束(头部,纽兰);
}
void insert2End(NodeTree*current,NodeTree*newElem)
{
std::deque队列;
队列。推回(当前);
NodeTree*lastElem=nullptr;
而(!queue.empty())
{
lastElem=queue.front();
queue.pop_front();
if(lastElem->left)
队列。推回(lastElem->left);
其他的
{
lastElem->left=newElem;
打破
}
if(lastElem->right)
队列。推回(lastElem->right);
其他的
{
lastElem->right=newElem;
打破
}
}
}
int postOrderTreeTraverser(NodeTree*in)
{
整数总和=0;
如果(在->左)
totalSum+=postOrderTreeTraverser(在->左侧);
如果(在->右侧)
totalSum+=postOrderTreeTraverser(在->右侧);
int returnVal=in->data;
如果(在->左!=nullptr |在->右!=nullptr)
在->数据=总和;
返回值;
}
无效儿童总数()
{
if(head==nullptr)
{
回来
}
postOrderTreeTraverser(头);
}
};
哦,是的,我没看见!谢谢:)