在线oj练习地址
- 判断两棵二叉树是否相同_leetcode100
- 判断一棵树是否是平衡二叉树_leetcode110
- 翻转二叉树_leetcode226
- 判断一棵树是否为对称二叉树_leetcode101
二叉树的结构判断类,多数可以用递归的思路来解决。
1.判断两棵二叉树是否相同
思路:
首先,判断两者根节点是否相同。
若不同,
则直接返回;
若相同,
则递归判断root1的左子树是否与root2的左子树结构是否相同。
则递归判断root1的右子树是否与root2的右子树结构是否相同。
代码如下:
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 isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
else
return false;
}
}
2.判断一棵树是否为平衡二叉树
思路:
和上题类似,先判断根节点的情况,在判断左右孩子的情况
代码:
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null)
return true;
int leftH = getHight(root.left);
int rightH = getHight(root.right);
if(Math.abs(leftH-rightH)<=1)
return isBalanced(root.left) && isBalanced(root.right);
else
return false;
}
public int getHight(TreeNode root){
if(root==null)
return 0;
else
return Math.max(getHight(root.left),getHight(root.right))+1;
}
}
3.翻转二叉树
思路:
先将根节点的左右孩子节点交换。
然后,分别对以左右孩子为根的左右子树进行翻转操作。
代码:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return root;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
4.判断一棵树是否为对称二叉树
思路:
首先,判断根节点的左右孩子结构是否对称相等。
若不对称不相等,则直接返回false;
若对称相等,则递归判断左子树的左孩子与右子树右孩子,
以及左子树的右孩子与右子树的左孩子是否对称相等。
代码如下:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
return true;
else
return isSame(root.left,root.right);
}
public boolean isSame(TreeNode root1,TreeNode root2) {
if(root1==null && root2==null)
return true;
if(root1 ==null || root2 ==null)
return false;
if(root1.val==root2.val){
return isSame(root1.left,root2.right) && isSame(root1.right,root2.left);
}else{
return false;
}
}
}