我有一个关于寻找二元整数树的路径之和的问题。这是针对大学的,因此要求如下: 从实验室工作表3B(二叉树)中获取代码以获取整数的二叉树,然后对 称为hasPathSum()的方法给出了一个二叉树和一个和,如果该树返回true 具有从根到叶的路径,因此沿路径的所有值加起来等于给定 和。如果找不到这样的路径,则返回false。函数原型是
int hasPathSum(struct node* node, int sum)
注意:“根到叶的路径”是树中从根节点开始的一系列节点 然后向下进行到叶子(没有子节点)。一棵空树包含 没有根到叶的路径。因此,例如,下面的树正好有四个根到叶 路径:
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
Root-to-leaf paths:
path 1: 5 4 11 7
path 2: 5 4 11 2
path 3: 5 8 13
path 4: 5 8 4 1
对于此问题,我们将关注此类路径的值之和- 例如,5-4-11-7路径上的值之和为5 + 4 + 11 + 7 = 27。
我遇到了麻烦。我有一棵二叉树,但是功能hasPathSum()需要传递一个节点,而不是一棵树。我无法弄清楚该如何做。我也不知道如何找到从根到叶的路径总和(也有hasPathSum主体)。这需要递归完成。
非常感谢您的帮助。
这是我的节点类:
#include <stdio.h>
#pragma once
struct TreeNode
{
public:
friend class BinaryTree;
TreeNode(int theData) : data(theData) {}
bool isLeaf();
private:
int data;
TreeNode *leftlink;
TreeNode *rightLink;
};
这是BinaryTree头文件:
#include "TreeNode.h"
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
#pragma once
class BinaryTree
{
public:
BinaryTree();
void add(int toadd);
int height();
void inorderShow() const;
int hasPathSum(TreeNode * tree, int sum);
private:
void add(TreeNode *toAdd, TreeNode *& addHere);
int height(TreeNode *& root);
TreeNode *root;
void inorderShow(TreeNode *subTree) const;
};
还有我的BinaryTree cpp文件:
#include "BinaryTree.h"
BinaryTree::BinaryTree()
{
}
void BinaryTree::add(int toAdd)
{
TreeNode *node = new TreeNode(toAdd);
add(node, root);
}
int BinaryTree::height()
{
return height(root);
}
void BinaryTree::add(TreeNode * toAdd, TreeNode *& addHere)
{
if (addHere == NULL)
addHere = toAdd;
else if (toAdd->data < addHere->data)
add(toAdd, addHere->leftlink);
else //toAdd->data >= addHere->data
add(toAdd, addHere->rightLink);
}
int BinaryTree::height(TreeNode *& n)
{
if (n == NULL)
return -1;
else
return 1 + max(height(n->leftlink), height(n->rightLink));
}
void BinaryTree::inorderShow(TreeNode * subTree) const
{
if (subTree != NULL)
{
inorderShow(subTree->leftlink);
cout << subTree->data << " ";
inorderShow(subTree->rightLink);
}
}
void BinaryTree::inorderShow() const
{
inorderShow(root);
}
int BinaryTree::hasPathSum(TreeNode * tree, int sum)
{
}
在main.cpp中,我有一棵树,如下所示:
#include <iostream>
#include "BinaryTree.h"
#include "TreeNode.h"
using namespace std;
int main()
{
BinaryTree tree;
tree.add(5);
tree.add(6);
tree.add(3);
tree.add(4);
tree.add(9);
tree.add(11);
cout << "Height of the tree is: ";
cout << tree.height() << " ";
cout << "\nIn Order Show:" << endl;
tree.inorderShow();
cout << "Root to leaft path: " << endl;
cout << endl;
system("pause");
return 0;
}
有人可以解释我如何完成此任务并满足要求(也就是不更改功能hasPathSum()参数),我对此表示感谢。
答案 0 :(得分:0)
在我看来要求是错误的(或可能是困惑的)
并编写一个名为hasPathSum()的方法,该方法给出了一个二叉树和一个 总和
因此,假设这是二叉树类的一种方法,则隐式地传递树,因此唯一的显式参数是sum。因此该方法应声明为
class BinaryTree
{
...
bool hasPathSum(int sum);
...
};
但是给定的签名是
int hasPathSum(struct node * node,int sum)
具有错误的返回类型(int
而不是bool
)和无法解释的node
参数。
这是我组织解决方案的方式,因为它涉及两种方法,所以也许可以解释这种困惑。
class BinaryTree
{
...
public:
bool hasPathSum(int sum) { return hasPathSumHelper(root, sum); }
...
private:
static bool hasPathSumHelper(TreeNode* node, int sum);
};
公共hasPathSum
方法具有问题描述所隐含的签名(唯一有意义的签名)。它只是调用传递根节点和总和的私有方法hasPathSumHelper
,从而解决了如何传递私有根节点的问题。
hasPathSumHelper
方法是递归例程,在该例程中完成了实际工作(留给您实施)。公众hasPathSum
只是通过调用此方法来开始计算。
在考虑如何实现hasPathSumHelper
时,您可能会发现添加其他参数(sum_so_far
参数,当您从树上下来时,是上面所有节点的总和)很有用。我感觉合理)。可以,因为这是私有方法,您可以添加所需的内容。