标签:
这题是判断一个二叉树是否对称,如第一棵树。
一开始我的想法很复杂,先把树序列化到数组中,再根据下标计算对称的位置进行判断。
后来发现,假设上面的第二层两个结点为p和q,判断p的左孩子跟q的右孩子是否相等,p的右孩子跟q的左孩子是否相等即可。
/**思路是层次遍历,每次两个结点出队,为p和q,若满足p.left=q.right且p.right=q.left,则入队,直到队列为空。 * @author admin * */ public class SymmetricTree { public static boolean isSymmetric(TreeNode root) { TreeNode[] queue=new TreeNode[256];//这个最好用ArrayList代替 int head=0; int tail=0; if(root==null) {//如果根为空 return true; } else if(root.leftChild==null&&root.rightChild==null){//如果左孩子和右孩子都为空 return true; } else if(root.leftChild!=null&&root.rightChild!=null&&root.leftChild.val==root.rightChild.val) {//若两者都不为空且值相等 queue[tail++]=root.leftChild;//左孩子入队 queue[tail++]=root.rightChild;//右孩子入队 } else {//若两者其中一个为空 return false; } boolean flag=true; while(head!=tail&&flag) {//当队列不为空且flag==true时 TreeNode node1=queue[head++];//出队 TreeNode node2=queue[head++]; //判断其node1的左孩子和node2的右孩子是否相等 if(node1.leftChild!=null||node2.rightChild!=null) { if(node1.leftChild!=null&&node2.rightChild!=null){ if(node1.leftChild.val==node2.rightChild.val) { queue[tail++]=node1.leftChild; queue[tail++]=node2.rightChild; } else { return false; } } else { return false; } } //判断其node1的右孩子和node2的左孩子是否相等 if(node1.rightChild!=null||node2.leftChild!=null) { if(node1.rightChild!=null&&node2.leftChild!=null){ if(node1.rightChild.val==node2.leftChild.val) { queue[tail++]=node1.rightChild; queue[tail++]=node2.leftChild; } else { flag=false; } } else { return false; } } } return flag; } }
但看了discussion以后发现,可以用递归或者栈来实现。
Use two pointers (p, q), traverse the tree simultaneously, p goes in-order while q goes reversed in-order, compare along the way. It can be done with pre-order and reversed pre-order or post-order and reversed post-order as well.
public boolean isSymmetric(TreeNode root) { return traverse(root, root); } private boolean traverse(TreeNode p, TreeNode q) { if (p == null && q == null) return true; if (p == null || q == null) return false; if (!traverse(p.left, q.right)) return false; if (p.val != q.val) return false; return traverse(p.right, q.left); }
于是我想出了下面的解法。
public static boolean isSymmetricTree(TreeNode root) { return traverse(root,root); } public static boolean traverse(TreeNode p,TreeNode q) { //如果两者同时为空,则为true if(p==null&&q==null) { return true; } //如果其中一个不为空,则为false if(p==null||q==null) { return false; } //判断值是否相等 return p.val==q.val&&traverse(p.left,q.right)&&traverse(p.right,q.left); }
其实树的很多问题都可以使用递归来解决,先找出一定的规律,再用递归来解决就很容易了。
例如判断两棵树是否相等。
public static boolean isSameTree(TreeNode p, TreeNode q) { return traverse(p, q); } public static boolean traverse(TreeNode p,TreeNode q) { if(p==null&&q==null) { return true; } if(p==null||q==null) { return false; } return p.val==q.val&&traverse(p.right,q.right)&&traverse(p.left,q.left); }
标签:
原文地址:http://www.cnblogs.com/qingfei1994/p/4840454.html