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 ? */
我无法理解为什么我的代码无效。请告诉我修复它的解决方案。
答案 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;
}
}