【イラスト】「ソードフィンガーオファー」のJava実装:与えられた二分木を操作し、それをソース二分木の鏡像に変換します。

1.タイトルの説明

指定されたバイナリツリーを操作し、ソースバイナリツリーのミラーイメージに変換します。

例:ソースバイナリツリー
            8 
           / \ 
          6 10 
         / \ / \ 
        5 7 
        911ミラーバイナリツリー
            8 
           / \ 
          10 6 
         / \ / \ 
        11 9 7 5

2.アルゴリズムのアイデア

   ①まず、ルートノードが十分に空であるかどうかを判断し、ルートノードが空の場合はnullを返します。それ以外の場合は、ルートノードしかない場合はルートノードを返します。

   ② 次に、ルートノードの左子ノードと右子ノードが交換され、左右の子ノードが交換を追跡するときの交換に注意し、相対位置は変更されません。

   ③次に、左の子と右の子が再帰を実行します

図:

3.コードの実装

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
     /*
       使用递归
       1、首先判断根节点是否为空,为空的话返回空;只有根节点的话,返回根节点
       2、再判断左右节点,递归
     */
    public TreeNode Mirror (TreeNode pRoot) {
          //判断根节点是够为空
      if(pRoot == null){
         return null;
      }
        // 如果只存在根节点,返回根节点
      if(pRoot.left == null && pRoot.right == null){
        return pRoot;
      }
      // 再对子树结点进行判断
      // 定义临时结点
      TreeNode temp = pRoot.left;
      pRoot.left = pRoot.right;
      pRoot.right = temp;
      
      //递归左子树
      Mirror(pRoot.left);
      
      //递归右子树
      Mirror(pRoot.right);
      //返回根节点
      return pRoot;
    }
}


 

 

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/115012931