给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false
解题思路:若两颗树都为空,那么这两棵树相同。若其中一棵树为空,那这两棵树不相同。若这两棵树都不为空,先断根节点是否相同,相同返回true,不相同直接返回false,再依次判断左子树和右子树,若都相同,则返回true。
代码:
class Solution {
public boolean isSameTree(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 isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
}
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
解题思路:如果两棵树都为空,返回true;如果其中一棵树为空,返回false;如果两棵树完全相同,返回true;如果两棵树都不为空,依次判断root的左右子树是否包含subRoot,若包含,返回true,反之返回false。
代码:
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null&&subRoot==null){
return true;
}
if(root==null||subRoot==null){
return false;
}
if(isSameTree(root,subRoot)){
return true;
}
return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);
}
public boolean isSameTree(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 isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
}
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
解题思路:若树为空,直接返回这颗树;若树的左子树和右子树都为空,直接返回这棵树;若左右子树都不为空,递归的遍历这棵树的左右子树,从叶子节点开始翻转,如果左右两颗子树都已经翻转,只需要交换两颗子树的位置。
代码:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)){
return root;
}
root.left=invertTree(root.left);
root.right=invertTree(root.right);
TreeNode num=root.left;
root.left=root.right;
root.right=num;
return root;
}
}
给你一个二叉树的根节点 root
, 检查它是否轴对称。
解题思路1:若树为空,则返回true;若该树的左树和右数都为空,则返回true;若该树的左右子树不为空,判断左右两棵子树是否轴对称相等。
代码1:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)){
return true;
}
return isMirror(root.left,root.right);
}
public boolean isMirror(TreeNode t1,TreeNode t2){
if(t1==null&&t2==null){
return true;
}
if(t1==null||t2==null){
return false;
}
if(t1.val!=t2.val){
return false;
}
return isMirror(t1.left,t2.right)&&isMirror(t1.right,t2.left);
}
}
解题思路2:若该树为空,则返回true;若该树的左子树和右子树都为空,则返回true;若左右子树不为空,将该树的左子树翻转,若翻转后的左子树与右子树相等,返回true。
代码2:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)){
return true;
}
root.left=invertTree(root.left);
return isSame(root.left,root.right);
}
public TreeNode invertTree(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)){
return root;
}
root.left=invertTree(root.left);
root.right=invertTree(root.right);
TreeNode num=root.left;
root.left=root.right;
root.right=num;
return root;
}
public boolean isSame(TreeNode t1,TreeNode t2){
if(t1==null&&t2==null){
return true;
}
if(t1==null||t2==null){
return false;
}
if(t1.val!=t2.val){
return false;
}
return isSame(t1.left,t2.left)&&isSame(t1.right,t2.right);
}
}
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
解题思路:若该树为空,返回true;若该树的左右节点都为空,返回true;若该树的左右节点不为空,使用绝对值方法求出左右节点高度差的绝对值,若绝对值大于1,返回false。
代码:
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null||(root.left==null&&root.right==null)){
return true;
}
int leftHeight=height(root.left);
int rightHeight=height(root.right);
int abs=Math.abs(leftHeight-rightHeight);
if(abs>1){
return false;
}
return isBalanced(root.left)&&isBalanced(root.right);
}
public int height(TreeNode root){
return root==null?0:1+Math.max(height(root.left),height(root.right));
}
}