代码随想录——第十七天

654.最大二叉树

又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历

题目链接/文章讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html 

视频讲解:https://www.bilibili.com/video/BV1MG411G7ox 

class Solution {

    public TreeNode constructMaximumBinaryTree(int[] nums) {

        if(nums.length == 0) return null;

        int max = -1, index = 0;

        for(int i = 0; i < nums.length; i ++){

            if(nums[i] > max){

                max = nums[i];

                index = i;

            }

        }

        TreeNode root = new TreeNode(max);

        if(nums.length == 1) return root;

        int[] left = sub(nums, 0, index);

        int[] right = sub(nums, index + 1, nums.length);

        root.left = constructMaximumBinaryTree(left);

        root.right = constructMaximumBinaryTree(right);

        return root;

    }

    public int[] sub(int[] array, int start, int end){

        int[] res = new int[end - start];

        int r = 0;

        for(int i = start; i < end; i ++){

            res[r ++] = array[i];

        }

        return res;

    }

}

617.合并二叉树

这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。

题目链接/文章讲解:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html 

视频讲解:https://www.bilibili.com/video/BV1m14y1Y7JK 

class Solution {

    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {

        if(root1 == null) return root2;

        if(root2 == null) return root1;

        if(root1 == null && root2 == null) return null;

        TreeNode cur = new TreeNode(root1.val + root2.val);

        TreeNode left = mergeTrees(root1.left, root2.left);

        TreeNode right = mergeTrees(root1.right, root2.right);

        cur.left = left;

        cur.right = right;

        return cur;

    }

}

700.二叉搜索树中的搜索

递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性

题目链接/文章讲解: https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html 

视频讲解:https://www.bilibili.com/video/BV1wG411g7sF 

class Solution {

    public TreeNode searchBST(TreeNode root, int val) {

        if(root == null) return null;

        if(root.val == val) return root;

        TreeNode left = searchBST(root.left, val);

        TreeNode right = searchBST(root.right, val);

        if(left != null) return left;

        if(right != null) return right;

        return null;

    }

}

class Solution {

    // 递归,普通二叉树

    public TreeNode searchBST(TreeNode root, int val) {

        if (root == null || root.val == val) {

            return root;

        }

        TreeNode left = searchBST(root.left, val);

        if (left != null) {

            return left;

        }

        return searchBST(root.right, val);

    }

}

class Solution {

    // 递归,利用二叉搜索树特点,优化

    public TreeNode searchBST(TreeNode root, int val) {

        if (root == null || root.val == val) {

            return root;

        }

        if (val < root.val) {

            return searchBST(root.left, val);

        } else {

            return searchBST(root.right, val);

        }

    }

}

class Solution {

    // 迭代,普通二叉树

    public TreeNode searchBST(TreeNode root, int val) {

        if (root == null || root.val == val) {

            return root;

        }

        Stack<TreeNode> stack = new Stack<>();

        stack.push(root);

        while (!stack.isEmpty()) {

            TreeNode pop = stack.pop();

            if (pop.val == val) {

                return pop;

            }

            if (pop.right != null) {

                stack.push(pop.right);

            }

            if (pop.left != null) {

                stack.push(pop.left);

            }

        }

        return null;

    }

}

class Solution {

    // 迭代,利用二叉搜索树特点,优化,可以不需要栈

    public TreeNode searchBST(TreeNode root, int val) {

        while (root != null)

            if (val < root.val) root = root.left;

            else if (val > root.val) root = root.right;

            else return root;

        return null;

    }

}

98.验证二叉搜索树

遇到 搜索树,一定想着中序遍历,这样才能利用上特性。

但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。

题目链接/文章讲解:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

视频讲解:https://www.bilibili.com/video/BV18P411n7Q4 


应该确保左子树的最大值小于根节点的值,且根节点的值小于右子树的最小值。

我的

class Solution {

    public boolean isValidBST(TreeNode root) {

        if(root == null) return true;

        if(root.left == null && root.right == null) return true;

        boolean left = isValidBST(root.left);

        boolean right = isValidBST(root.right);

        if(root.left == null) return root.val < root.right.val && right;

        if(root.right == null) return root.left.val < root.val && left;

        boolean mid = root.left.val < root.val && root.val < root.right.val;

        return left && mid && right;

    }

}

root =

[5,4,6,null,null,3,7]

添加到测试用例

输出

true

预期结果

false


classSolution{// 递归TreeNodemax;publicbooleanisValidBST(TreeNoderoot){if(root==null){returntrue;}// 左booleanleft=isValidBST(root.left);if(!left){returnfalse;}// 中if(max!=null&&root.val<=max.val){returnfalse;}max=root;// 右booleanright=isValidBST(root.right);returnright;}}classSolution{// 迭代publicbooleanisValidBST(TreeNoderoot){if(root==null){returntrue;}Stack<TreeNode>stack=newStack<>();TreeNodepre=null;while(root!=null||!stack.isEmpty()){while(root!=null){stack.push(root);root=root.left;// 左}// 中,处理TreeNodepop=stack.pop();if(pre!=null&&pop.val<=pre.val){returnfalse;}pre=pop;root=pop.right;// 右}returntrue;}}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容