100.相同的树
两棵树相同的条件就是根节点及他们的左右子树的值val相同,结构相同,就是一模一样,那这道题最终还是要同时遍历两个树的,并且还得遍历完,那如果我们在遍历的过程中,通过设置一些不满足相同的树的条件,那么只要遍历到不同的,就返回false。并且在每一次左右子树递归完成后就进行判断,(各自判断一次),如果不满足就不往下遍历了,否则,一直遍历。
不同的条件:左根为空并且右根不为空,或者,左根不为空并且右根为空,或者,左右根的值val不同。
算法代码
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null&&q==null) return true; //说明本层遍历到末尾了,且本层是相同的树
if(p==null&&q!=null || p!=null&&q==null || p.val != q.val) return false; //树不相同的全部条件
boolean left = isSameTree(p.left,q.left);
if(left == false) return false; //返回fslse说明不相同,结束遍历,返回true则得继续遍历
boolean right = isSameTree(p.right,q.right);
if(right == false) return false; //返回fslse说明不相同,结束遍历,返回true则得继续遍历
return true; //能执行到这里说明本层根节点及子树是相同的,再往上一层递归的归
}
}
226.翻转二叉树
即从根节点开始,翻转根节点的左右子树,再以左孩子节点为当前根节点,翻转左孩子的左右子树,再以右孩子节点为当前根节点,翻转右孩子的左右子树.......依次往下递归,即就把每一个节点当成当前的根节点,再翻转它的左右子树,这样递归就形成了。(可以写一个交换函数)
算法代码
class Solution {
/*
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
exchange(root); //交换函数
invertTree(root.left);
invertTree(root.right);
return root;
}
public static void exchange(TreeNode root){
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
}
*/
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
TreeNode tmp = root.left; //临时节点,用来交换
root.left = root.right;
root.right = tmp;
invertTree(root.left); //对根的左子树进行交换
invertTree(root.right); //对根的右子树进行交换
return root;
}
}
572.另一棵树的子树
另一棵树的子树,实则还得判断root的的子树与subRoot相不相同,即可引用上面两棵相同的树的代码成为一个函数,判断相不相同,在遍历的时候,root树需要不断的往下遍历,而subRoot树只在root树与其(指SubRoot树)根节点相同的时候才再往下遍历。即函数传递节点的时候总是传递subRoot树的根节点。这点很重要。
算法代码
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
//第一种
/*
if(isSameTree(root,subRoot)==true) return true; // 归的条件
if(root==null ) return false; // 归的条件
return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot); //不断的递
*/
//第二种
/*
if(root==null ) return false;
if(isSameTree(root,subRoot)==true) return true;
if(isSubtree(root.left,subRoot)==true) return true;
if(isSubtree(root.right,subRoot)==true) return true;
return false;
*/
}
public static boolean isSameTree(TreeNode p, TreeNode q) { //借用相同的树的代码
if(p==null&&q==null) return true;
if(p==null&&q!=null || p!=null&&q==null || p.val != q.val) return false;
boolean left = isSameTree(p.left,q.left);
if(left == false) return false;
boolean right = isSameTree(p.right,q.right);
if(right == false) return false;
return true;
}
}