【题目描述】
翻转一颗二叉树,依次翻转二叉树的左右孩子。
示例
输入:
输出:
思路
提供两种方法:1.自顶向下;2.自底向上。
自顶向下的方法,就是依次交换左右孩子节点,若左右孩子节点不为空,则继续交换其孩子节点,直到遍历到的节点为空;自底向上的方法,递归地对树进行遍历,并从叶子节点开始翻转。因为会遍历树中的每一个节点,因此时间复杂度为O(N),对于空间复杂度,是由递归的栈的深度决定的,平均情况下是O(logN),最坏情况下,形成链的时候,空间复杂度为O(N)。
自顶向下
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null)
return null;
if(!(root.left == null && root.right == null)){ //左右孩子节点都非空的情况
//交换左右孩子节点
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
//如果孩子节点不为空,则继续进行交换
if(root.left != null)
invertTree(root.left);
if(root.right != null)
invertTree(root.right);
}
return root;
}
}
自底向上
class Solution {
public TreeNode invertTree(TreeNode root) {
//当root节点为空时,返回空节点,递归结束
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
//交换左右孩子节点
root.left = right;
root.right = left;
return root; //遇到了叶子节点时,直接返回该节点
}
}