1. 程式人生 > >【101-Symmetric Tree(對稱樹)】

【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>