1.二叉树的最大深度
描述:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
思路:
(1)递归调用左子树和右子树
(2)若根为空返回0
(3)返回左右子树中大的那一个+1(根本身)
代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return leftDepth > rightDepth ?
leftDepth + 1 : rightDepth + 1;
}
}
2. 相同的树
描述:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路:
利用递归的思想,先判断当前层的根节点,在判断下一层的左右孩子节点
(1)若两个根都为空返回true
(2)若一个为空另一个不为空(两种)或者两个根不相等,返回false
(3)递归左孩子节点与右孩子节点,相等返回true
代码:
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;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
3. 另一棵树的子树
描述:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树
思路:
(1)定义辅助方法isSameTree判断相同树
(2)若subRoot为空,一定是子树返回ture,若subRoot不为空但是root为空,直接返回false,若两树相等返回true
(3)递归遍历左右子树和subTree比较
代码:
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(subRoot == null) return true;
if(root == null) return false;
return isSameTree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public boolean isSameTree(TreeNode root, TreeNode subRoot){
if(root == null && subRoot == null) return true;
if(root == null && subRoot != null || root != null &&subRoot == null || root.val != subRoot.val) return false;
return isSameTree(root.left, subRoot.left) && isSameTree(root.right, subRoot.right);
}
}