剑指offer_对称的二叉树
题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的
方法一:和镜像树比较是否相同,注意要先拷贝树。
1 /* 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 boolean isSymmetrical(TreeNode pRoot) 16 { 17 if (pRoot == null) return true; 18 TreeNode memo = copyTree(pRoot); 19 mirror(pRoot); 20 return isEqual(memo,pRoot); 21 } 22 boolean isEqual(TreeNode memo,TreeNode pRoot){ 23 if(memo == null&&pRoot==null) return true; 24 if(memo == null||pRoot==null) return false; 25 if(memo.val!=pRoot.val) return false; 26 return isEqual(memo.left,pRoot.left)&&isEqual(memo.right,pRoot.right); 27 } 28 public void mirror(TreeNode root){ 29 if(root == null) return; 30 TreeNode temp = root.left; 31 root.left = root.right; 32 root.right = temp; 33 mirror(root.left); 34 mirror(root.right); 35 } 36 37 public TreeNode copyTree(TreeNode root){ 38 if(root==null) return null; 39 TreeNode t = new TreeNode(root.val); 40 t.left = copyTree(root.left); 41 t.right = copyTree(root.right); 42 return t; 43 } 44 }
方法二:
可以直接递归比较左右子树是否一样
1 /* 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 boolean isSymmetrical(TreeNode pRoot) 16 { 17 if(pRoot==null) return true; 18 return isEqual(pRoot.left,pRoot.right); 19 } 20 boolean isEqual(TreeNode left,TreeNode right){ 21 if(left==null&&right==null) return true; 22 if(left==null||right==null) return false; 23 if(left.val!=right.val) return false; 24 return isEqual(left.left,right.right)&&isEqual(left.right,right.left); 25 } 26 }

浙公网安备 33010602011771号