【101-Symmetric Tree(对称树)】

来源:互联网 发布:apache ddos ip 大量 编辑:程序博客网 时间:2024/05/16 09:03
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>
0 0