剑指Offer 19 二叉树的镜像

题目描述

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

思路

画图可得:如果根节点下面有子节点的话,就把他们交换位置;比较难的还是一个递归的思想;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
public void Mirror(TreeNode root) {
if (root==null) //防止根节点为空
return;
if (root.left==null&&root.right==null) //防止他没有两个根节点;如果有一个也需要交换位置
return;
TreeNode node =root.left; //交换位置
root.left=root.right;
root.right=node;
if (root.left!=null) //递归左边
Mirror(root.left);
if (root.right!=null) //递归右边
Mirror(root.right);
}

循环压栈的方法,其实和递归差不多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static public void Mirror1(TreeNode treeNode)
{
Stack<TreeNode> stack = new Stack<>();
stack.push(treeNode);
while (!stack.empty())
{
TreeNode node = stack.pop();
if (node.left!=null&&node.right!=null) {
TreeNode temp = node.left;
node.left=node.right;
node.right=temp;
}
if (node.left!=null)
stack.push(node.left);
if (node.right!=null)
stack.push(node.right);
}
}

收获

  1. 画图会让思路更清晰,先把思路理清楚,然后再敲代码
  2. 递归的代码还是比较难以书写的,但是写出来就很容易看懂;