Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
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>