题目:操作给定的二叉树,将其变换为源二叉树的镜像。
输出
输入描述:
二叉树的镜像定义:源二叉树
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;
}