题目:
目录
第一次做错误思路:
想着直接将两边节点进行交换,2和7,1和9,3和6,这种解法实现比较困难,偏于暴力解法
正确解法:
我们只需将每个节点的左右节点进行交换即可;
解法一:递归
自下而上:先对左右子树进行递归,递归结束后,在回溯的过程中进行左右子树的交换,就实现了自下而上的翻转。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
//自下而上,先进行左右右子树递归
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
//左右子树交换
root.left = right;
root.right = left;
return root;
}
}
自上而下:在每次递归之前进行左右节点的交换,实现了自上而下翻转
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
//在每次递归之前进行左右节点的交换
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
//进行左右右子树递归
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
return root;
}
}
解法二:迭代
迭代法也就是借助广度优先遍历(层序遍历二叉树),将打印节点的操作替换为交换左右节点
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
//创建队列
Queue<TreeNode> queue = new LinkedList<TreeNode>();
//将root节点加入队列
queue.offer(root);
while(!queue.isEmpty()){
//将队列元素逐个poll出来
TreeNode node = queue.poll();
//进行交换左右节点
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
//依次将node的左右节点入栈
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
return root;
}
}