LeetCode基础算法-树
LeetCode 树 基础算法
1. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
解题:
- 树相关的问题一般都需要靠递归来实现。
- 当前节点的深度= 1+max(左子树深度,右子树深度)。
- 如果当前节点左右孩子均为null,则当前点为根的树的深度为1.
public int maxDepth(TreeNode root) {
// 总结处递归的基线条件
if (root == null) return 0;
if (root.left == null && root.right == null) {
return 1;
}
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
2. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
解题思路:
- 递归实现来验证。
- 主要解决的问题是需要框定节点的大小值范围。
- 当前节点的左孩子:小于根节点的值。
- 当前节点的右孩子:大于根节点的值。
public boolean isValidBST(TreeNode root) {
return validate(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private boolean validate(TreeNode root, int min, int max) {
if (root == null) {
return true;
}
if (root.val <= min || root.val >= max) {
return false;
}
return validate(root.left, min, root.val) && validate(root.right, root.val, max);
}
3. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
解题思路:
- 递归实现。
- 注意树的对称性即可。
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return validSymmetric(root.left, root.right);
}
private boolean validSymmetric(TreeNode left, TreeNode right) {
if (left == null && right == null) {
return true;
} else if (left == null && right != null) {
return false;
} else if (right == null && left != null) {
return false;
} else {
if (left.val != right.val) {
return false;
} else {
return validSymmetric(left.left, right.right) && validSymmetric(left.right, right.left);
}
}
}
4. 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路:
- 树的层次遍历主要c采用队列的概念来实现,但是本题目不能使用队列,因为需要分层。
- 采用List<List>来存储遍历数据,只有同一层的节点才会被加入。
- 采用递归的概念逐步遍历每一层。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
// 根节点是第0层。
levelOrder(root, 0, result);
return result;
}
private void levelOrder(TreeNode root, int level, List<List<Integer>> result) {
if (root == null) {
return;
}
// 添加每一层的数据存储
if (level == result.size()) {
result.add(new ArrayList<>());
}
// 首先加入根节点
result.get(level).add(root.val);
// 先左后右
levelOrder(root.left, level + 1, result);
levelOrder(root.right, level + 1, result);
}
5. 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
解题思路:
- 使用二分搜索的概念来建立二叉平衡树
public TreeNode sortedArrayToBST(int[] nums) {
if (nums == null || nums.length == 0) {
return null;
}
return getTree(nums, 0, nums.length - 1);
}
private TreeNode getTree(int[] nums, int low, int high) {
if (low <= high) {
// 找到中点
int mid = low + (high - low) / 2;
// 以中点建立根节点
TreeNode node = new TreeNode(nums[mid]);
// 建立左子树
node.left = getTree(nums, low, mid - 1);
// 建立右子树
node.right = getTree(nums, mid + 1, high);
return node;
} else {
return null;
}
}