合并二叉树
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//终止条件是两个点都到叶子结点
if(root1==null && root2==null)return null;
TreeNode root=new TreeNode();
if(root1!=null && root2==null) {
root.val=root1.val;
}
else if(root1==null && root2!=null) {
root.val=root2.val;
}
else if (root1!=null && root2!=null) {
root.val=root1.val+root2.val;
}
//需要注意可能此时的root1已经是null,就没法找到它的左右结点,但是可以将左右结点设置为null传入即可
root.left=mergeTrees(root1==null ? null:root1.left, root2==null ? null:root2.left);
root.right=mergeTrees(root1==null ? null:root1.right, root2==null ? null:root2.right);
return root;
}
二叉搜索树中的搜索
public TreeNode searchBST(TreeNode root, int val) {
if(root==null)return null;
if(root.val==val)return root;
if(root.val>val) {
return searchBST(root.left, val);
}
if(root.val<val) {
return searchBST(root.right, val);
}
return root;
}
验证二叉搜索树
思想:二叉搜索树的中序遍历满足升序序列,所以可以用list存储中序遍历结果,再对list判断。
错误的版本过不了这个例子:[5,4,6,null,null,3,7],左子树的节点全部小于根节点,右子树的节点全部大于根节点
List<Integer> res=new LinkedList<>();
public boolean isValidBST(TreeNode root) {
dfs(root);
for(int i=1; i<res.size(); i++) {
if(res.get(i)<=res.get(i-1))return false;
}
return true;
}
public void dfs(TreeNode root) {
if(root==null)return;
dfs(root.left);
res.add(root.val);
dfs(root.right);
}
中序遍历一遍,递归判断
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 访问左子树
if (!isValidBST(root.left)) {
return false;
}
// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
if (root.val <= pre) {
return false;
}
pre = root.val;
// 访问右子树
return isValidBST(root.right);
}
}
二叉搜索树的最小绝对值
思想:在中序遍历过程中去更新最小的差值
也可以放在list中,然后循环遍历list去找到最小的差值
Integer min=Integer.MAX_VALUE;
TreeNode pre=null;
public int getMinimumDifference(TreeNode root) {
dfs(root);
return min;
}
public void dfs(TreeNode root) {
if(root==null)return;
dfs(root.left);
if(pre!=null)min=Math.min(root.val-pre.val, min);
pre=root;
dfs(root.right);
}