题目:
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
解法1:递归(从上到下)
/**
* 思路:
* 本质上就是左右节点互换
* 从根节点开始,不断的向下递归,把每层的左右节点互换就可以
*/
public TreeNode invertTree(TreeNode root) {
recursive(root);
return root;
}
private void recursive(TreeNode root) {
if (root==null)return ;
TreeNode tmp = root.right;
root.right=root.left;
root.left=tmp;
recursive(root.left);
recursive(root.right);
}
时间复杂度:On
空间复杂度:O1
解法2:递归(自下到上)
/**
* 思路:
* 本质上就是左右节点互换
* 从叶子节点开始,互换,不断的向上递归
*/
public TreeNode invertTree(TreeNode root) {
if (root==null)return null;
TreeNode right = invertTree(root.right);
TreeNode left = invertTree(root.left);
root.left=right;
root.right=left;
return root;
}
时间复杂度:On
空间复杂度:O1
解法3:队列
/**
* 思路:
* 把root放入队列,队列不为null,一直迭代
* 之后互换其左右,只要左右节点存在就入队
*/
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
TreeNode poll = queue.poll();
TreeNode left = poll.left;
poll.left=poll.right;
poll.right=left;
if (poll.left!=null)queue.offer(poll.left);
if (poll.right!=null)queue.offer(poll.right);
}
return root;
}
时间复杂度:On
空间复杂度:On
解法4:栈(和队列的代码完全一样)
public TreeNode invertTree(TreeNode root) {
if (root==null)return root;
ArrayDeque<TreeNode> stak = new ArrayDeque<>();
stak.push(root);
while (!stak.isEmpty()){
TreeNode pop = stak.pop();
TreeNode tmp = pop.left;
pop.left=pop.right;
pop.right=tmp;
if (pop.left!=null)stak.push(pop.left);
if (pop.right!=null)stak.push(pop.right);
}
return root;
}
时间复杂度:On
空间复杂度:On