判断二叉树是否镜像

问题:

  请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

分析:

  (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     }

 

posted @ 2020-05-20 15:06  Yrc的楚门的世界  阅读(610)  评论(0编辑  收藏  举报