zoukankan      html  css  js  c++  java
  • 判断二叉树是否镜像

    问题:

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

    分析:

      (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     }
  • 相关阅读:
    CF
    求最长反链 || Dilworth 定理
    APIO 2020 补题记录
    CF vp 记录
    虚树
    LCT 学习
    平衡树
    poly
    关于此博客
    题解 P5021【NOIP2018】 【赛道修建】
  • 原文地址:https://www.cnblogs.com/dream-flying/p/12923731.html
Copyright © 2011-2022 走看看