给定两棵树,如果它们在结构上相同则返回true,它们由具有相同值的相同值的节点组成

时间:2016-06-27 18:02:47

标签: java eclipse

public static boolean identical(treenode<Integer> root1,treenode<Integer> root2)
    {
        boolean ans;
        for(int i=0;i<root1.children.size();i++)
        for(int j=0;j<root2.children.size();j++)
        {
         boolean subans=identical(root1.children.get(i),root2.children.get(j));
         ans=subans;
        }
        if(root1.data==root2.data)
        {
            ans=true;
        }/* what's wrong with the code*/
        else{
            ans=false;
        }
        return ans;
    }/* how can i improve it ? */

我无法理解为什么我的代码无效。请告诉我修复它的解决方案。

4 个答案:

答案 0 :(得分:1)

在评估这些递归调用的布尔返回值之前,for循环将遍历identical的每次递归调用。换句话说,您不会通过递归调用来评估所有孩子的数据。我相信你的代码可能只是在评估树中每个节点的最后一个子节点(从最右边开始)。

你也有一个嵌套的for循环,在你的情况下这是不必要的。

我建议的是:

1)检查当前节点的值是否相同。如果不是,或者如果至少有一个为null,则立即返回false。

2)检查两个节点的子节点大小是否相同。如果没有,请返回false。

3)以递归方式对每个子节点进行调用。

这是深度优先,左侧优先搜索。

答案 1 :(得分:1)

private boolean structurallyIdentical(Node tnode, Node onode) {
    if(tnode == null && onode == null) {
        return true;
    }
    if(tnode != null && onode != null) {
        // check that the left branch is identical
        boolean left = structurallyIdentical(tnode.left, onode.left);
        // check that the right branch is identical
        boolean right = structurallyIdentical(tnode.right, onode.right);
        // only identical, if both branches match
        return (left && right);
    }
    return false;
}

答案 2 :(得分:0)

根据@Vansh Nandwani 的回答进行了一些改进。 SBT = 相同二叉树

    public  boolean SBT(BinNode root1, BinNode root2)
    {
        if (root1 == null && root2 == null) return true;
        if (root1 != null && root1 != null) {
            if (root1.value() == root2.value())//check if the values are the same 
               {
                boolean left = SBT(root1.left(), root2.left());
                boolean right = SBT(root1.right(), root2.right);
                return (left && right);}
                } 
        return false;
    }

答案 3 :(得分:0)

public class Solution {

/*  TreeNode structure 
    class TreeNode<T> {
        T data;
        ArrayList<TreeNode<T>> children;

        TreeNode(T data){
            this.data = data;
            children = new ArrayList<TreeNode<T>>();
        }
    }*/
    
    public static boolean checkIdentical(TreeNode<Integer> root1, TreeNode<Integer> root2){

        if(root1.children.size()!=root2.children.size())
        {
            return false;
        }
         if(root1.children.size()==root2.children.size()){
            if(root1.data==root2.data)
            {
                for(int i=0 ,j=0;i<root1.children.size()&&j<root2.children.size();i++ ,j++){
                    checkIdentical(root1.children.get(i),root2.children.get(j));
                        return true;
                }
            }
        }
        return false;
    }
}