1. 相同二叉树
递归左右子树是否相同
终止条件:有一颗树为空---两颗树都为空,返回true否则返回false
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p==null || q==null) return p==q;
return p.val==q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
2.对称二叉树
同上:只是现在判断左子树等于右子树,右子树等于左子树
递归左右子树是否相同
终止条件:有一颗树为空---两颗树都为空,返回true否则返回false
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root==null) return true;
return isSameTree(root.left, root.right);
}
//判断两颗子树是否相同
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p==null || q==null) return p==q;
return p.val==q.val && isSameTree(p.left, q.right) && isSameTree(p.right, q.left);
}
}
3.平衡二叉树
左右子树的高度差不为1
递归函数:找左右子树的高度
返回值为int,
如果左右子树高度差大于1,返回-1,将-1传到上面去
如果上面没有接收到-1,返回该子树的高度(max(左子树深度,右子树深度)+1)
class Solution {
public boolean isBalanced(TreeNode root) {
return findDepth(root)!=-1;
}
public int findDepth(TreeNode root) {
if (root==null) return 0;
//递归找左右子树的深度
int lh=findDepth(root.left);
if(lh==-1) return -1; //上一轮左右子树差大于1,传上去,结束
int rh=findDepth(root.right);
if(rh==-1) return -1;
//左右子树的深度差大于1,不平衡
if(Math.abs((lh-rh))>1) return -1;
return Math.max(lh, rh)+1;
}
}
4.二叉树的右视图
先递归右子树,再递归左子树
问题:如何把答案记下来?
如何判断该节点需要记录到结论中?---在递归同时维护一个递归深度,如果递归深度等于答案长度,则该节点需要被记录
(先递归右子树,再往左走,往左走的节点其深度小于答案长度时不记录(被右边节点挡住了))
1,3,4记录后,答案长度为3,根节点向左走,节点2,5的深度小于3,不记录
class Solution {
List<Integer> ans=new ArrayList<Integer>();
public List<Integer> rightSideView(TreeNode root) {
df(root, 0);
return ans;
}
public void df(TreeNode root,int depth){
//终止条件
if(root==null) return;
if(depth==ans.size()) ans.add(root.val);
df(root.right, depth+1);//下一个节点的深度为上一个节点的+1
df(root.right, depth+1);
}
}