把每一个节点的左右孩子交换一下,关键在于遍历顺序,前中后序应该选哪一种遍历顺序? 这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!
- 确定递归函数的参数和返回值:参数就是要传入节点的指针,返回值的话也是节点。
- 确定终止条件:
if (root == NULL) return root;
- 确定单层递归的逻辑:是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
//中
TreeNode tmp = root.right;
root.right = root.left;
root.left = tmp;
//递归交换当前节点的 左子树
invertTree(root.left);
//递归交换当前节点的 右子树
invertTree(root.right);
//函数返回时就表示当前这个节点,以及它的左右子树
//都已经交换完了
return root;
}
}
判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
二叉树的遍历,最应该确定的是遍历顺序!
我们比较外侧节点是否相等,也要比较内侧节点是否相等,我们这道题只能使用后序遍历,(左右中),因为我们要不断收集左右两节点,返还给上一个节点
只有左右不为空,且值相等才能递归到下一层
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
private boolean compare(TreeNode left; TreeNode right){
if(left == null && right != null) return false;
else if(left != null && right == null) return false;
else if(left == null && right == null) return true;
else if(left.val != right.val) return false;
boolean compareOut = compare(left.left,right.right);
boolean compareIn = compare(left.right,right.left);
return compareOut && compareIn;
}
}
第一步:确定递归函数的传入值和返回值,开始传入是根节点的左右节点, 递归考虑问题一般是考虑子问题扩展整体,也就是解决所有子问题就可以解决整体,所以可以先想象成最简单的二叉树也就是三个节点可以考虑出左右放入左右树确定参数,一般是从子问题考虑(也就是简单底层)。
第二步,考虑返回值,基于第一步来,对最简单二叉树思考,什么情况返回。
第三步,考虑单层逻辑,比较左侧的外节点和右侧的外节点,比较左侧的内节点和右侧的内节点