226.二分木を反転します(Java実装)-LeetCode

トピック:

二分木を反転します。

例:

入る:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

出力:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

注:
この質問は、MaxHowellの元の質問に触発されています。

Google:エンジニアの90%があなたが書いたソフトウェア(Homebrew)を使用していますが、インタビュー中にホワイトボードに二分木をひっくり返すという質問を書くことはできません。これは残念です。

解決策1:再帰(上から下へ)

    /**
     * 思路:
     * 本质上就是左右节点互换
     * 从根节点开始,不断的向下递归,把每层的左右节点互换就可以
     */
    public TreeNode invertTree(TreeNode root) {
    
    
        recursive(root);
        return root;
    }

    private void recursive(TreeNode root) {
    
    
        if (root==null)return ;
        TreeNode tmp = root.right;
        root.right=root.left;
        root.left=tmp;
        recursive(root.left);
        recursive(root.right);
    }

時間計算量:オン

スペースの複雑さ:O1
ここに画像の説明を挿入

解決策2:再帰(下から上)

    /**
     * 思路:
     * 本质上就是左右节点互换
     * 从叶子节点开始,互换,不断的向上递归
     */
    public TreeNode invertTree(TreeNode root) {
    
    
        if (root==null)return null;
        TreeNode right = invertTree(root.right);
        TreeNode left = invertTree(root.left);
        root.left=right;
        root.right=left;
        return root;
    }

時間計算量:オン

スペースの複雑さ:O1
ここに画像の説明を挿入

解決策3:キュー

/**
 * 思路:
 * 把root放入队列,队列不为null,一直迭代
 * 之后互换其左右,只要左右节点存在就入队
 */
     public TreeNode invertTree(TreeNode root) {
    
    
        if (root == null) return null;
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
    
    
            TreeNode poll = queue.poll();
            TreeNode left = poll.left;
            poll.left=poll.right;
            poll.right=left;
            if (poll.left!=null)queue.offer(poll.left);
            if (poll.right!=null)queue.offer(poll.right);
        }
        return root;
    } 

時間計算量:オン

スペースの複雑さ:オン
ここに画像の説明を挿入

解決策4:スタック(キューのコードとまったく同じ)

    public TreeNode invertTree(TreeNode root) {
    
    
        if (root==null)return root;
        ArrayDeque<TreeNode> stak = new ArrayDeque<>();
        stak.push(root);
        while (!stak.isEmpty()){
    
    
            TreeNode pop = stak.pop();
            TreeNode tmp = pop.left;
            pop.left=pop.right;
            pop.right=tmp;
            if (pop.left!=null)stak.push(pop.left);
            if (pop.right!=null)stak.push(pop.right);
        }
        return root;
    }

ここに画像の説明を挿入
時間計算量:オン

スペースの複雑さ:オン

おすすめ

転載: blog.csdn.net/qq_38783664/article/details/112860156