【剑指Offer系列】27-二叉树的镜像(分治-递归)

题目:操作给定的二叉树,将其变换为源二叉树的镜像。

输出

输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5


思路:

递归

  • 根节点不动
  • 交换左右节点
public class ReverseTree {
    public static void main(String[] args) {
        // [4,2,7,1,3,6,9]
        TreeNode n1 = new TreeNode(4);
        TreeNode n21 = new TreeNode(2);
        TreeNode n22 = new TreeNode(7);
        TreeNode n31 = new TreeNode(1);
        TreeNode n32 = new TreeNode(3);
        TreeNode n33 = new TreeNode(6);
        TreeNode n34 = new TreeNode(9);
        n1.left = n21;
        n1.right = n22;
        n21.left = n31;n21.right = n32;
        n22.left = n33;n22.right=n34;

        n1 = reverseTree(n1);
        List<Integer> list = bfs(n1);
        System.out.println(list);//[4, 7, 2, 9, 6, 3, 1]
    }

    private static TreeNode reverseTree(TreeNode root) {
        if (root == null || root.left == null && root.right == null) {
            return root;
        }
        recursionReverse(root, root.left, root.right);
        return root;
    }

    private static void recursionReverse(TreeNode root, TreeNode leftNode, TreeNode rightNode) {
    	// 根节点的左右节点都为null了,就没有交换的必要了
        if (leftNode == null && rightNode == null) {
            return;
        }
        root.left = rightNode;
        root.right = leftNode;
        // 左子节点不为空,才需要递归
        if (leftNode != null) {
            recursionReverse(leftNode, leftNode.left, leftNode.right);
        }
        if (rightNode != null) {
            recursionReverse(rightNode, rightNode.left, rightNode.right);
        }
    }
}

宽度优先遍历结果

    private static List<Integer> bfs(TreeNode root) {
        Queue<TreeNode> queue = new LinkedBlockingQueue<>();
        queue.add(root);
        List<Integer> list = new ArrayList<>();
        while (queue.size() > 0) {
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值