比如对两棵树而言,一般是对称,反转,合并
1、判断两棵树是否相同
leetcode100
思路:判断一个节点是否相同:不同的返回,都为空且相同的返回。 不为空的相同不返回,要接着对比子节点,递归遍历该节点的子节点是否相同。
public static boolean isSameTree(TreeNode p, TreeNode q){
//判断一个节点是否相同,3个if,不同返回,都为空的相同返回,不为空的相同不返回,要接着对比子节点
//如果都为空,相同
if(p == null && q == null){
return true;
}
//如果一个为空,一个不为空,不同
if(p == null || q == null){
return false;
}
//如果这两个节点都不为空并且又不相等,不同
if(p.val != q.val){
return false;
}
//递归遍历该节点的子节点是否相同
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
时间复杂度:O(min(m,n))
空间复杂度:O(min(m,n))
2、对称二叉树
leetcode101
与判断两棵树是否相同类似,只不过递归的不再是两棵树的节点比较,而是一颗树的左子树和右子树。并且递归不再是指针同一个方向移动。而是一个在左的时候,一个在右。一个在右的时候,一个在左。来比较是否相同。最后判断是否对称。
public static boolean isSymmetric(TreeNode root){
if(root == null) return true;
return check(root.left, root.right);
}
public static boolean check(TreeNode p, TreeNode q){
if(p == null && q == null) return true;
if(p == null || q == null) return false;
if(p.val != q.val) return false;
//外侧和里侧是否相同
return check(p.left, q.right) && check(p.right, q.left);
}
时间复杂度:O(n)
空间复杂度:O(n)
3、合并二叉树
leetcode617
如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空;
如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点;
如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和。
public static TreeNode mergeTrees(TreeNode root1, TreeNode root2){
//这两个if技巧包含了r1、r2是否为null的排列组合情况
if(root1 == null) return root2;//r1为null,返回的是r2
if(root2 == null) return root1;
TreeNode merged = new TreeNode(root1.val + root2.val);
merged.left = mergeTrees(root1.left, root2.left);
merged.right = mergeTrees(root1.right, root2.right);
return merged;
}
时间复杂度:O(min(m,n))
空间复杂度:O(min(m,n))
主要取决于较小的那个树。
下述情况中到5的时候,3的左孩子赋给5,右孩子赋给null,就终止递归了。
5本来就连着7,所以不需要管。
树1
树2