LeetCode Invert Binary Tree OJ 刷题 算法

Invert Binary Tree

Invert a binary tree.

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

to
     4
   /   \
  7     2
 / \   / \

Solution

import java.util.ArrayList;
import java.util.List;

public class InvertBinaryTree {
    public static void main(String[] args) {

        TreeNode r0 = new TreeNode(8);

        TreeNode r11 = new TreeNode(4);
        TreeNode r12 = new TreeNode(10);

        TreeNode r21 = new TreeNode(2);
        TreeNode r31 = new TreeNode(1);
        TreeNode r23 = new TreeNode(9);
        TreeNode r24 = new TreeNode(12);
        r0.left = r11;
        r0.right = r12;
        r11.left = r21;
        r12.left = r23;
        r12.right = r24;
        r21.left = r31;
        // outputTree(r0);
        // invertTree(r0);
        // outputTree(r0);
        //
        TreeNode rr0 = new TreeNode(4);

        TreeNode rr11 = new TreeNode(2);
        TreeNode rr12 = new TreeNode(7);

        TreeNode rr21 = new TreeNode(1);
        TreeNode rr22 = new TreeNode(3);
        TreeNode rr23 = new TreeNode(6);
        TreeNode rr24 = new TreeNode(9);

        rr0.left = rr11;
        rr0.right = rr12;

        rr11.left = rr21;
        rr11.right = rr22;
        rr12.left = rr23;
        rr12.right = rr24;
        // outputTree(rr0);
        // invertTree(rr0);
        // outputTree(rr0);

        TreeNode q0 = new TreeNode(2);
        TreeNode q11 = new TreeNode(3);
        TreeNode q21 = new TreeNode(1);

        q0.left = q11;
        q11.left = q21;

        outputTree(q0);
        invertTree(q0);
        outputTree(q0);

    }

    public static TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        if (root.left != null && root.right != null) {
            int temp = root.left.val;
            root.left.val = root.right.val;
            root.right.val = temp;

            TreeNode tempLeft = root.left.left;
            root.left.left = root.right.left;
            root.right.left = tempLeft;

            TreeNode tempRight = root.left.right;
            root.left.right = root.right.right;
            root.right.right = tempRight;

            invertTree(root.left);
            invertTree(root.right);
        }
        if (root.left == null && root.right == null) {
            return root;
        }
        if (root.left == null) {
            root.left = new TreeNode(root.right.val);
            root.left.left = root.right.left;
            root.left.right = root.right.right;
            root.right = null;
            invertTree(root.left);
            return root;
        }

        if (root.right == null) {
            root.right = new TreeNode(root.left.val);
            root.right.left = root.left.left;
            root.right.right = root.left.right;
            root.left = null;
            invertTree(root.right);
            return root;
        }

        return root;

    }

    public static void outputTree(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.println(root);
        List<TreeNode> former = new ArrayList<TreeNode>();
        former.add(root);
        while (former.size() != 0) {

            List<TreeNode> current = new ArrayList<TreeNode>();

            for (TreeNode node : former) {
                System.out.print(node.left + ", ");
                System.out.print(node.right + ", ");
                if (node.left != null) {
                    current.add(node.left);
                }
                if (node.right != null) {
                    current.add(node.right);
                }
            }
            System.out.println();
            former.clear();
            former.addAll(current);
        }

    }
}

反思

这道题 错了几次, 自己做出来了

先是定义了一个输出 tree 的方法, 便于查看是否 invert 成功


几次错误的原因

//wrong answer
if (root.left == null) {
        root.left = new TreeNode(root.right.val);
        root.left.left = root.right.left;
        root.left.right = root.right.right;
        root.right = null;
        //wrong answer
    }

if (root.right == null) {
    root.right = new TreeNode(root.left.val);
    root.right.left = root.left.left;
    root.right.right = root.left.right;
    root.left = null;
    //wrong answer
}

这儿是因为上面判断了 left 为 null 的情况, 但是将 right 置为null, 会进到下面的 right == null 的if 块 里

要在 if (root.left == null) {...} 最末加上
return root;


第二次错误 原因

还是上面的代码块,

//wrong answer
if (root.left == null) {
        root.left = new TreeNode(root.right.val);
        root.left.left = root.right.left;
        root.left.right = root.right.right;
        root.right = null;
        //invertTree(root.left);
        return root;
    }

if (root.right == null) {
    root.right = new TreeNode(root.left.val);
    root.right.left = root.left.left;
    root.right.right = root.left.right;
    root.left = null;
    //invertTree(root.right);
    return root;
}

你会发现加了 return root 后, 如果 left 为空的话, 它和 right 交换后, 方法就返回了

它们的子节点并没有交换

要加上递归语句 invertTree(root.right);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值