二叉树结构

  1. class TreeNode {
  2. int val = 0;
  3. TreeNode left = null;
  4. TreeNode right = null;
  5. public TreeNode(int val) {
  6. this.val = val;
  7. }
  8. }

题目描述

  • 请完成一个函数,输入一个二叉树,输出它的镜像
  • 二叉树镜像定义

  • 源二叉树

剑指Offer之十九-二叉树的镜像 - 图1

  • 镜像二叉树

剑指Offer之十九-二叉树的镜像 - 图2

解析

  • 先序遍历给定树的每个结点
  • 若遍历到的结点有子节点,就交换它的两个子结点
  • 当交换完所有非叶子结点的左右子节点之后,就得到了树的镜像

递归实现

  1. public void mirror(TreeNode root) {
  2. if(root == null || (root.left == null && root.right == null)){
  3. return ;
  4. }
  5. TreeNode temp = root.left;
  6. root.left = root.right;
  7. root.right = temp;
  8. if(root.left != null){
  9. mirror(root.left);
  10. }
  11. if(root.right != null){
  12. mirror(root.right);
  13. }
  14. }

非递归实现

  1. public void mirror2(TreeNode root) {
  2. if(root == null || (root.left == null && root.right == null)){
  3. return ;
  4. }
  5. Stack<TreeNode> s = new Stack<TreeNode>();
  6. s.push(root);
  7. while(!s.isEmpty()){
  8. TreeNode node = s.pop();
  9. //交换左右孩子结点
  10. TreeNode nodeTemp = node.left;
  11. node.left = node.right;
  12. node.right = nodeTemp;
  13. //遍历左子树
  14. if(node.left != null){
  15. s.push(node.left);
  16. }
  17. //遍历右子树
  18. if(node.right != null){
  19. s.push(node.right);
  20. }
  21. }
  22. }
  23. <p></p>