Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目:给定一颗二叉树,要求将这颗二叉树翻转并返回根节点。
解题思路
实际上就是将二叉树转为对称二叉树的另一面,和LeetCode101的对称二叉树有点像。
我们可以想象一下:
- 当树只有一个根节点的时候,此时不需要翻转。
- 当树有三个结点的时候,此时只需要将左子树结点和右子树结点互换即可。
- 当树结点大于三个的时候,此时应该?
第三种情况就是解决本题的重点,此时我们只要想到了交换左右子树,那么答案也就很明显了。当一棵树超过三个结点,我们可以直接交换左右子树,之后通过递归再完成子树内部的交换即可,代码如下:
public TreeNode invertTree(TreeNode root) {
if(root==null) return null;
TreeNode right = root.right;
root.right = invertTree(root.left);
root.left = invertTree(right);
return root;
}
上述代码通过直接交换左右子树的位置达到了整棵树的翻转。时间复杂度和空间复杂度都是。
还有一种方法可以通过层序遍历的方式得到答案,所需要注意的是使用一种数据结构(如栈)记录每次的结点,而每次出栈必须出一层的元素,代码如下:
public TreeNode invertTree3(TreeNode root) {
if(root==null) return null;
ArrayDeque<TreeNode> deque = new ArrayDeque<>();
deque.offer(root);
while(!deque.isEmpty()){
int size = deque.size();
while(size-->0){
TreeNode node = deque.poll();
TreeNode left = node.left;
node.left = node.right;
node.right = left;
if(node.left!=null) deque.offer(node.left);
if(node.right!=null) deque.offer(node.right);
}
}
return root;
}
实际上这种方式和上面的交换方式刚好反过来了,这里是先从上往下一层层交换,而上面递归的思路则是从底层向上交换。此方式的时间复杂度为,空间复杂度也为。