题目描述
我的解法
思路
从结果来看,就是将每个节点的左右子节点互换了;
方法上属于层序遍历,适合使用队列结构;
具体实现,即使用基础的层序遍历方法,不过有两点区别:
- 将子节点加入队列时调整下顺序,先加入右节点,再加入左节点;
- 添加成功后才将当前节点弹出,因为要对当前节点的左右节点进行更改
以上的思路关键的地方在于:需要对每个节点的左右子节点进行修改,但是修改之前需要记录下原来节点的信息
那这么说也可以先将左右节点顺序进行修改,然后再按照原本的层序遍历方法不进行改动
层序遍历的迭代法
对应Java代码
class Solution {
public TreeNode invertTree(TreeNode root) {
TreeNode node = root;
Deque<TreeNode> qu = new LinkedList<TreeNode>();
if(node != null) {qu.offerLast(node);}
while(!qu.isEmpty()){
node = qu.pollFirst();
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
if(node.left != null) {qu.offerLast(node.left);}
if(node.right != null) {qu.offerLast(node.right);}
}
return root;
}
}
复杂度分析
时间复杂度:O(n) 只对二叉树进行了一次遍历
空间复杂度:O(1) 额外定义了一个节点的空间用来进行左右子树交换
收获总结
既然只是需要将每个节点的左右子节点交换一下,其实所有遍历方法都可以(中序遍历不行,它会将部分节点反转两次),只需要在正常的遍历流程中,添加翻转这一步骤,既然这样的话,写法就很多了,前、后序遍历的递归法、迭代法,层序遍历的迭代法、递归法等,这里再尝试下后序遍历的递归法
后序遍历的递归法
对应Java代码
class Solution {
public TreeNode invertTree(TreeNode root) {
invertNode(root);
return root;
}
public void invertNode(TreeNode node) {
if(node == null) {return;}
invertNode(node.left);
invertNode(node.right);
TreeNode tmp = node.left;
node.left = node.right;
node.right = tmp;
}
}