【101-Symmetric Tree(对称树)】

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
  For example, this binary tree is symmetric:
<code class="hljs tex has-numbering">    1
   / <span class="hljs-command">\
</span>  2   2
 / <span class="hljs-command">\ </span>/ <span class="hljs-command">\
</span>3  4 4  3</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

  But the following is not:

<code class="hljs tex has-numbering">    1
   / <span class="hljs-command">\
</span>  2   2
   <span class="hljs-command">\ </span>  <span class="hljs-command">\
</span>   3    3</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

  Note:
  Bonus points if you could solve it both recursively and iteratively.

题目大意

  给定一棵树,判断它是否是对称的。即树的左子树是否是其右子树的镜像。

解题思路

  使用递归进行求解,先判断左右子结点是否相等,不等就返回false,相等就将左子结点的左子树与右子结果的右子结点进行比较操作,同时将左子结点的左子树与右子结点的左子树进行比较,只有两个同时为真是才返回true,否则返回false。

代码实现

树结点类

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> TreeNode {
    <span class="hljs-keyword">int</span> val;
    TreeNode left;
    TreeNode right;
    TreeNode(<span class="hljs-keyword">int</span> x) { val = x; }
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

算法实现类

<code class="hljs vbscript has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Solution {

    <span class="hljs-keyword">public</span> boolean isSymmetric(TreeNode root) {

        <span class="hljs-keyword">if</span> (root == <span class="hljs-literal">null</span>) {
            return <span class="hljs-literal">true</span>;
        } <span class="hljs-keyword">else</span> {
            return isSame(root.<span class="hljs-built_in">left</span>, root.<span class="hljs-built_in">right</span>);
        }
    }

    <span class="hljs-keyword">private</span> boolean isSame(TreeNode <span class="hljs-built_in">left</span>, TreeNode <span class="hljs-built_in">right</span>) {
        <span class="hljs-keyword">if</span> (<span class="hljs-built_in">left</span> == <span class="hljs-literal">null</span> && <span class="hljs-built_in">right</span> == <span class="hljs-literal">null</span>) {
            return <span class="hljs-literal">true</span>;
        }  <span class="hljs-keyword">if</span> (<span class="hljs-built_in">left</span> != <span class="hljs-literal">null</span> && <span class="hljs-built_in">right</span> == <span class="hljs-literal">null</span> || <span class="hljs-built_in">left</span> == <span class="hljs-literal">null</span> && <span class="hljs-built_in">right</span> != <span class="hljs-literal">null</span>){
            return <span class="hljs-literal">false</span>;
        } <span class="hljs-keyword">else</span> {
            return <span class="hljs-built_in">left</span>.val == <span class="hljs-built_in">right</span>.val && isSame(<span class="hljs-built_in">left</span>.<span class="hljs-built_in">left</span>, <span class="hljs-built_in">right</span>.<span class="hljs-built_in">right</span>) && isSame(<span class="hljs-built_in">left</span>.<span class="hljs-built_in">right</span>, <span class="hljs-built_in">right</span>.<span class="hljs-built_in">left</span>);
        }
    }
}</code>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值