C ++二叉树路径查找

时间:2019-03-09 14:40:22

标签: c++ tree binary-tree binary-search-tree

我有一个关于寻找二元整数树的路径之和的问题。这是针对大学的,因此要求如下: 从实验室工作表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()参数),我对此表示感谢。

1 个答案:

答案 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参数,当您从树上下来时,是上面所有节点的总和)很有用。我感觉合理)。可以,因为这是私有方法,您可以添加所需的内容。