检查二叉树是否具有相同的结构

时间:2014-03-30 00:44:45

标签: java recursion data-structures

我应该检查二叉树是否与使用递归的另一棵树具有相同的结构。 我遇到麻烦的部分是弄清楚如何在每个级别检查是否存在左侧或右侧并将其与另一个树进行比较。任何形式的帮助将不胜感激。

public  boolean hasSameStructureAs(BinaryTree tree){
     //If left and right are null they are still similar
    if(leftChild == null && rightChild == null);
        return true;
    if (leftChild == null && rightChild != null)
        return false;
    if (leftChild != null && rightChild == null){
        return false;

//我在下面的代码的递归部分遇到问题,我想我有部分正确

    if (!tree.equals(rightChild.left,leftChild.left )) return false;
    if (!tree.equals(rightChild.right, leftChild.right)) return false;

    return true;

以下是一些构造函数和get / set方法。

 public class BinaryTree {
private String data;
private BinaryTree leftChild;
private BinaryTree rightChild;

public BinaryTree(String d) {
    data = d;
    leftChild = null;
    rightChild = null;
}

public BinaryTree(String d, BinaryTree left, BinaryTree right) {
    data = d;
    leftChild = left;
    rightChild = right;
}

public String getData() {
    return data;
}

public BinaryTree getLeftChild() {
    return leftChild;
}

public BinaryTree getRightChild() {
    return rightChild;}

5 个答案:

答案 0 :(得分:1)

你的BinaryTree是一个递归数据结构,因此你可以在编写递归函数时按照常用方法递归地进行检查 - 假设它已经写好了。

这就是我的意思:假设您的BinaryTree类有一个可以在子节点上使用的hasSameStructureAs方法。你会如何用它检查当前节点?

  • 检查tree.getLeftChild()再次this.leftChild的左子树;如果hasSameStructureAs返回false,也会返回false。如果两个左子树都是null,请继续检查
  • 再次检查tree.getRightChild() this.rightChild的正确子树;如果hasSameStructureAs返回false,也会返回false。如果两个正确的子树都是null,或hasSameStructureAs返回true,那么也请返回true

那就是 - 你完成了!您需要做的就是null检查其左右子树,并在其上调用hasSameStructureAs

答案 1 :(得分:0)

我需要看到你的.equals方法绝对肯定,但看起来你并没有递归地做。如果你想要它是递归的,如果两个树都有一个左子或两个都有一个正确的子(或两者)递归返回该方法,将这些子传递为新的"根"检查他们的孩子。

如果有任何不匹配的地方,请返回false。如果您已达到所有孩子都离开的点(无效儿童),则返回true。

除此之外,它就像使方法预先递归一样简单。 (访问父母 - >访问左孩子,如果有的话 - >访问右孩子,如果有的话,每次访问孩子时重复上述过程。)

答案 2 :(得分:0)

假设你没有覆盖等号,那么:

if (!tree.equals(rightChild.left,leftChild.left )) return false;

不会做你想做的事。 equals()的默认实现只返回(this == other),并且只有当它们是完全相同的对象(即在内存中的相同位置)时才会为真。

你实际上还没有任何递归。递归意味着函数调用自身。考虑到左右儿童也是树木。您已经有一个方法hasSameStructureAs,当完成后,对于结构相同的树将返回true。因此,您的解决方案应该在两棵树的左右子节点上调用hasSameStructureAs(),并组合从每个"侧面获得的值"。

通常,递归问题的策略是将其分解为递归情况和一个或多个基本情况。使用树形结构,您的基础案例将涉及叶子。树中的叶子是子链接为空的节点。

想象一下,你有一个布尔值来临时存储左侧是否相等。

  • 如果this.leftChild和other.leftChild都为null,则leftEq为true
  • 如果只有其中一个为null,则leftEq为false
  • 否则leftEq是this.leftChild.hasSameStructure(other.leftChild)

你会对rightEq做同样的事情,然后返回leftEq和rightEq。

就我个人而言,我认为考虑到这个问题的一个原因是你的hasSameStructure是从其中一棵树的角度编写的。也许考虑一下如何使用外部方法hasSameStructure(treeA, treeB)来解决它,然后将其转化为实际要求的内容。

答案 3 :(得分:0)

线索#1:您的方法被称为" hasSameStructureAs"。因为它是递归的,它需要调用" hasSameStructureAs"。

线索#2:您的代码传递了一个名为" tree"的参数。但你甚至都不看它。

建议:将BinaryTree重命名为Node(因为它是一个有孩子的节点,而不是树),并重命名"树"参数"",然后明确使用"这个"访问"这个"对象,这样你就可以看到属于"这个"与"":

public boolean hasSameStructureAs(Node that)
    {
    // first, only bother to check if the children are different at all
    // (if they are both null, for example, then they will be equal)
    if (this.leftChild != that.leftChild)
        {
        // second, since we already know that they are unequal, if either
        // one of them is null, then the data structure is unequal
        if (this.leftChild == null || that.leftChild == null)
            {
            return false;
            }

        // third, since neither one is null, let's recursively ask them if
        // they are the same
        if (!this.leftChild.hasSameStructureAs(that.leftChild))
            {
            return false;
            }
        }
    // and so on ..

另外,由于这可能是家庭作业,你真的需要学会自己解决一些问题。

答案 4 :(得分:0)

对于作业有同样的问题,我就是这样做的,可能不是最有效的,但结果是准确的

public boolean hasSameStructureAs(BinaryTree tree){


    if(tree.getLeftChild() == null && this.getLeftChild() == null) {
        if(tree.getRightChild() == null && this.getRightChild() == null) {
            return true;}}

    if(tree.getLeftChild() == null && this.getLeftChild() == null) {
        if(tree.getRightChild() != null && this.getRightChild() != null) {
            return this.getRightChild().hasSameStructureAs(tree.getRightChild());}}

    if(tree.getLeftChild() != null && this.getLeftChild() != null) {
        if(tree.getRightChild() != null && this.getRightChild() != null) {
            return this.getRightChild().hasSameStructureAs(tree.getRightChild()) &&   this.getLeftChild().hasSameStructureAs(tree.getLeftChild());}}

    if(tree.getLeftChild() != null && this.getLeftChild() != null) {
        if(tree.getRightChild() == null && this.getRightChild() == null) {
            return this.getLeftChild().hasSameStructureAs(tree.getLeftChild());}}


    return false;



 }