ваша программа потерпит неудачу для контрольного примера:
tree1 : 1
/ \
null null
tree2: 2
/ \
1 null
ясно, что у обоих деревьев есть только один конечный узел 1 , но ваш код завершится ошибкой, потому что вы выполняете итерацию на обоих из них одинаково. Вы должны выполнять итерации по ним отдельно и хранить листовые узлы в массиве. И в конце проверьте, имеют ли оба массива одинаковые элементы независимо от порядка.
tree1 : 1
/ \
2 3
tree2: 1
/ \
3 2
Над двумя деревьями одинаковые листья, я обновил функции, чтобы реализовать их правильно.
public int leafSimilar(TreeNode root, int arr[], int l) {
if(root == null)
{
return l;
}
if(root.left == null && root.right == null)
{
arr[l] =root.val ;
l+=1;
return l;
}
l = leafSimilar(root.left, l);
l = leafSimilar(root.right, l);
return l;
}
public boolean compareLeaves(int arr1[], int arr2[], int l, int r)
{
if( l != r ) return false;
for(int i = 0; i <l ;i ++)
{
boolean flag = true;
for(int j = 0; j <r ;j ++) {
if(arr1[i] == arr2[j])
{
flag = false;
break;
}
}
if( flag) return false;
}
return true;
}
int l = leafSimilar(root1, arr1, 0);
int r = leafSimilar(root2, arr2, 0);
compareLeaves(arr1, arr2, l, r);
Также вышеприведенная функция потерпит неудачу, если дерево может иметь дублирующий узелОбновите функцию сравнения, чтобы подсчитать частоту всех узлов в первом массиве, а затем сопоставить ее с частотой узлов в массиве 2. Он будет обрабатывать дубликаты узлов.