判断二叉树是否镜像
问题:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析:
(1)先序遍历和中序遍历可以唯一确定一棵二叉树
(2)左右子树镜像:右子树的遍历规则也需要使用镜像遍历规则
(3)分别将先序遍历+中序遍历的结果串接在一起,然后比较左右子树的串接结果。
(4)边界情况判断:头结点为空,也属于对称:
code:
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 boolean isSymmetrical(TreeNode pRoot) { 15 //头结点为空的情况 16 if(pRoot==null){ 17 return true; 18 } 19 20 StringBuilder leftBuilder1 = new StringBuilder(); //左先序 21 StringBuilder leftBuilder2 = new StringBuilder(); //左中序 22 //遍历左子树 23 Search(pRoot.left,leftBuilder1,leftBuilder2); 24 //串接结果 25 leftBuilder1.append(leftBuilder2); 26 27 StringBuilder rightBuilder1 = new StringBuilder(); //右先序 28 StringBuilder rightBuilder2 = new StringBuilder(); //右中序 29 //遍历右子树 30 mirrorSearch(pRoot.right,rightBuilder1,rightBuilder2); 31 //串接结果 32 rightBuilder1.append(rightBuilder2); 33 //比较判断 34 if(leftBuilder1.toString().equals(rightBuilder1.toString())){ 35 return true; 36 }else{ 37 return false; 38 } 39 40 } 41 //左枝:先序遍历+中序遍历 42 public void Search(TreeNode head,StringBuilder preBuilder1,StringBuilder midBuilder){ 43 if(head!=null){ 44 preBuilder1.append(head.val); 45 if(head.left!=null){ 46 Search(head.left,preBuilder1,midBuilder); 47 }else{ 48 preBuilder1.append("#"); 49 midBuilder.append("#"); 50 } 51 midBuilder.append(head.val); 52 if(head.right!=null){ 53 Search(head.right,preBuilder1,midBuilder); 54 }else{ 55 preBuilder1.append("#"); 56 midBuilder.append("#"); 57 } 58 } 59 } 60 //右枝:镜像先序遍历+中序遍历 61 public void mirrorSearch(TreeNode head,StringBuilder preBuilder1,StringBuilder midBuilder){ 62 if(head!=null){ 63 preBuilder1.append(head.val); 64 if(head.right!=null){ 65 mirrorSearch(head.right,preBuilder1,midBuilder); 66 }else{ 67 preBuilder1.append("#"); 68 midBuilder.append("#"); 69 } 70 midBuilder.append(head.val); 71 if(head.left!=null){ 72 mirrorSearch(head.left,preBuilder1,midBuilder); 73 }else{ 74 preBuilder1.append("#"); 75 midBuilder.append("#"); 76 } 77 } 78 }