面向测试用例编程
自己写的:
中序遍历将数据加入到数组,判断是否为回文对称,但是,这个代码有bug,无法通过特殊测试用例。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
ArrayList<Integer> array=new ArrayList<>();
boolean isSymmetrical(TreeNode pRoot) {
int n=0;
TreeNode temp=pRoot;
inOder(pRoot);
if(array.size()%2==0 && pRoot!=null ){
return false;
}
for(int i=0;i<array.size();i++){
if(array.get(i)!=array.get(array.size()-i-1)){
return false;
}
}
return true;
}
public void inOder(TreeNode node){
if(node!=null){
inOder(node.left);
array.add(node.val);
inOder(node.right);
}
}
}
还得是看看官方思路:
思路
前序遍历的时候我们采用的是“根左右”的遍历次序,如果这棵二叉树是对称的,即相应的左右节点交换位置完全没有问题,那我们是不是可以尝试“根右左”遍历,按照轴对称图像的性质,这两种次序的遍历结果应该是一样的。
不同的方式遍历两次,将结果拿出来比较看起来是一种可行的方法,但也仅仅可行,太过于麻烦。我们不如在遍历的过程就结果比较了。而遍历方式依据前序递归可以使用递归:
- 终止条件: 当进入子问题的两个节点都为空,说明都到了叶子节点,且是同步的,因此结束本次子问题,返回true;当进入子问题的两个节点只有一个为空,或是元素值不相等,说明这里的对称不匹配,同样结束本次子问题,返回false。
- 返回值: 每一级将子问题是否匹配的结果往上传递。
- 本级任务: 每个子问题,需要按照上述思路,“根左右”走左边的时候“根右左”走右边,“根左右”走右边的时候“根右左”走左边,一起进入子问题,需要两边都是匹配才能对称。
具体做法
- step 1:两种方向的前序遍历,同步过程中的当前两个节点,同为空,属于对称的范畴。
- step 2:当前两个节点只有一个为空或者节点值不相等,已经不是对称的二叉树了。
- step 3:第一个节点的左子树与第二个节点的右子树同步递归对比,第一个节点的右子树与第二个节点的左子树同步递归比较
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
ArrayList<Integer> array=new ArrayList<>();
boolean isSymmetrical(TreeNode pRoot) {
return inOder(pRoot,pRoot);
}
public boolean inOder(TreeNode node1,TreeNode node2){
//当节点同时到达叶子结点
if(node1==null && node2==null ){
return true;
}
//有一个为空 或者值不相等 返回返回false
if(node1==null || node2 ==null || node1.val!=node2.val){
return false;
}
//对称进行前序遍历
return inOder(node1.left,node2.right) && inOder(node1.right,node2.left);
}
}