6.13、14 二叉树

合并二叉树

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);
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值