反转左右节点,并反转左右子树
package FTree;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/16 0016 13:51
*/
public class Problem226 {
/**
* 找出终止条件
找出返回值
明确这一步递归干了什么
递归讲究宏观出发,不应该牛角尖一定要知道每一步递归干了什么,个人意见勿喷。hh
* @param root
* @return
*/
//反转二叉树
public TreeNode invertTree(TreeNode root) {
inverse(root);
return root;
}
public void inverse(TreeNode root){
if(root==null) return ;
//反转左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right=temp;
invertTree(root.left);
invertTree(root.right);
}
/**
* 遍历每个节点交换左右子树
* 对左右子节点都进行反转(
* 这道题是一个从下到上的分治问题,
* 先把子树invert
* 在把invert之后的left和right子树互换位置,逐层递进
*/
public TreeNode invertTree1(TreeNode root){
if(root==null) return null;
TreeNode temp = root.left;
root.left=root.right;
root.right=temp;
root.left=invertTree1(root.left);
root.right=invertTree1(root.right);
return root;
}
}