代码随想录算法刷题训练营第十五天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

 思路:在数组中找最大的值作为根节点,左右子树照着递归

public TreeNode build(int[] nums,int begin,int end) {
    if(end == begin) return null;

    int idx = findMax(nums);
    int root = nums[idx];
    TreeNode rootnode = new TreeNode(root);
    if(end - begin == 1) return rootnode;

    List<int[]> list = partition(nums);
    int leftBegin = begin;
    int leftEnd = begin + idx;

    int rightBegin = begin + idx + 1;
    int rightEnd = end;
    rootnode.left = build(list.get(0),leftBegin,leftEnd);
    rootnode.right = build(list.get(1),rightBegin,rightEnd);
    return rootnode;
}

617.合并二叉树

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

思路:弄到两个二叉树的并集

我用递归:

  1. 参数和返回值:返回值为结点,参数为两棵树的同一位置结点
  2. 终止条件:root1 和root2 都为空就返回null
  3. 单层逻辑:root1 ,root2有一个为空就把他变成0;这个位置的node就为root1+root2;推卸责任,node的左孩子就是root1的左孩子 + root2的左孩子,右孩子同理;最后返回node;
    public TreeNode merge(TreeNode root1,TreeNode root2) {
        if(root1 == null && root2 == null)return null;
        if(root1 == null) root1 = new TreeNode(0);
        if(root2 == null) root2 = new TreeNode(0);
        
        TreeNode root = new TreeNode(root1.val + root2.val);
        root.left = merge(root1.left,root2.left);
        root.right = merge(root1.right,root2.right);
        return root;
    }

700.二叉搜索树中的搜索

题目链接:​​​​​​​​​​​​​​. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

 思路:肯定要用到二叉树搜索树都性质,所有左子树都小于根节点,右子树大于结点

递归实现:

  • 参数和返回值:返回值为结点(要找到那个结点),参数为node和目标值
  • 终止条件为:结点为空返回空,结点val为目标值就返回结点;
  • 单层逻辑:如果结点值小于目标值就推责任给右孩子,大于目标值就推给左孩子;最后返回左右孩子里面不为空的那个,都为空就返回空
    public TreeNode search(TreeNode node,int val) {
        // if(node.left == null && node.right == null && node.val != val) {
        //     return null;
        // }
        if(node == null)return null;
        if(node.val == val) return node;
        TreeNode a = null;
        TreeNode b = null;
        if(node.val < val) {
            if(node.right != null)
            a = search(node.right,val);
        }else {
            if(node.left != null)
            b = search(node.left,val);
        }
        // if(node.left != null)  a= search(node.left,val);
        // if(node.right != null) b = search(node.right,val);
        return a == null ? b : a;
    }

98.验证二叉搜索树

题目链接:​​​​​​​​​​​​​​. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

 思路:考察二叉搜索树都性质,二叉搜索树按照中序遍历为一个递增的序列

验证一个二叉树是否为二叉搜索树也需要中序遍历展开,过程中看是否满足递增

可以用递归法:

递归三部曲:

  1. 返回值和参数,返回值为布尔表示这个是否是二叉搜索树(过程中是否出现不满足的情况,不递增了),参数为结点
  2. 终止条件为:结点为空,返回true;
  3. 单层逻辑是:要进行中序遍历,先推卸给左孩子,在处理中结点,如果中结点不满足递增就返回false;再推给右孩子;返回左&&右;
 递归法
 public boolean isValid(TreeNode node) {
     if(node == null) return true;
     boolean left = isValid(node.left);//左
     if(pre != null && pre.val >= node.val)return false;
     pre = node;
     boolean right = isValid(node.right);
     return left && right;
 }

也可以用迭代法,用栈实现中序遍历

Deque<TreeNode> deque = new LinkedList<>();
if(root == null) return true;
TreeNode cur = root;
while(cur != null || !deque.isEmpty()) {
    if(cur != null) {
        deque.push(cur);
        cur = cur.left;//左
    }else {
        cur = deque.pop();//中
        if(pre != null && pre.val >= cur.val)return false;
        pre = cur;
        cur = cur.right;//右
    }
}
return true;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值