● 654.最大二叉树
● 617.合并二叉树
● 700.二叉搜索树中的搜索
● 98.验证二叉搜索树
刷完四道二叉树相关算法题的总结
- 代码技巧
在编写二叉树相关算法时,需要考虑到二叉树的特性,即每个节点最多有两个子节点。因此,在编写递归算法时,可以通过传入当前节点的左子节点或右子节点来实现递归。另外,二叉搜索树的特性是左子树的节点值小于根节点,右子树的节点值大于根节点,因此在处理二叉搜索树问题时,可以利用这一特性进行递归或遍历操作。
- 刷题技巧
在刷题时,建议先理解题目要求和所给数据结构的特性,再考虑算法实现。对于二叉树相关题目,可以先画出样例树,通过观察样例树的特点来思考算法实现。另外,在编写递归算法时,需要注意递归的边界条件和返回值,以及递归中的变量传递。
- 部分核心Java代码
(1) 最大二叉树
public TreeNode constructMaximumBinaryTree(int[] nums) {
if (nums == null || nums.length == 0) {
return null;
}
int maxIndex = findMaxIndex(nums);
TreeNode root = new TreeNode(nums[maxIndex]);
root.left = constructMaximumBinaryTree(Arrays.copyOfRange(nums, 0, maxIndex));
root.right = constructMaximumBinaryTree(Arrays.copyOfRange(nums, maxIndex + 1, nums.length));
return root;
}
private int findMaxIndex(int[] nums) {
int maxIndex = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[maxIndex]) {
maxIndex = i;
}
}
return maxIndex;
}
(2) 合并二叉树
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if (t1 == null) {
return t2;
}
if (t2 == null) {
return t1;
}
TreeNode root = new TreeNode(t1.val + t2.val);
root.left = mergeTrees(t1.left, t2.left);
root.right = mergeTrees(t1.right, t2.right);
return root;
}
(3) 二叉搜索树中的搜索
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) {
return null;
}
if (root.val == val) {
return root;
} else if (root.val < val) {
return searchBST(root.right, val);
} else {
return searchBST(root.left, val);
}
}
(4) 验证二叉搜索树
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if (root == null) {
return true;
}
if (root.val <= minVal || root.val >= maxVal) {
return false;
}
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}