首页 > 其他分享 >【刷题】杨辉三角

【刷题】杨辉三角

时间:2024-08-19 19:25:41浏览次数:11  
标签:遍历 return int 杨辉三角 null root 节点 刷题

目录

  • 杨辉三角
    • 题目描述
    • 解题思路
    • 解题代码
  • 相同的树
    • 题目描述
    • 解题思路
  • 二叉树的层序遍历
    • 题目描述
    • 解题思路
    • 解题代码
    • 从底层层序遍历
  • 二叉树的最近公共祖先
    • 题目描述
    • 解题思路
  • 从前序与中序遍历序列构建二叉树
    • 题目描述
    • 解题思路
  • 从后序与中序遍历序列构建二叉树
    • 题目描述
    • 解题思路
  • 根据二叉树创建字符串
    • 题目描述
    • 解题思路

在这里插入图片描述

杨辉三角

链接:杨辉三角

题目描述

题目描述如下:
在杨辉三角中当前数等于上一行的同一个列数和其前面一个数的和。
左右边界为1。
杨辉三角题目

解题思路

解题思路如下:
我们使用顺序表

  1. 先把

解题代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
         List<List<Integer>> ret = new ArrayList<>();
         List<Integer> list = new ArrayList<>();
         //先把第一行安排
         list.add(1);
         ret.add(list);
         //处理后面除最后一个
         for(int i = 1; i < numRows; i++) {
             //记录当前行,并将第一个给1
         List<Integer> nowRow = new ArrayList<>();
         nowRow.add(1);
             //记录上一行
             List<Integer> perRow = new ArrayList<>();
             perRow = ret.get(i-1);
             //重第二个元素录入
             for(int j = 1; j < i; j++) {
                Integer a = perRow.get(j) + perRow.get(j-1);
                 nowRow.add(a);
             }
             //最后一个给1
             nowRow.add(1);
             ret.add(nowRow);   
         }
         return ret;
    }
}

相同的树

链接:相同的树

题目描述

解题思路

判断只有以下四种情况:

  • 两个树都为空。
  • 其中一棵树为空。
  • 当前节点值相同,递归调用判断左子树和右子树。
  • 当前节点值不同,返回false。
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //两个树都为空
        if(p == null && q == null) return true;
        //其中一棵树为空
        if((p == null && q != null) || (p != null && q == null)) return false;
        //值相同
        if(p.val == q.val) {
           return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        }
        //值不同
        return false;
    }
}

二叉树的层序遍历

链接:二叉树的层序遍历

题目描述

解题思路

解题思路如下:

  1. 先创建一个二维数组,如果树为空,就返回空的二维数组,不要返回null。
  2. 再根据层序遍历思路,将根结点入队,循环遍历直到队列为空。
  3. 求当前队列的长度,以长度为循环条件(因为如此每次循环都将只保留本次循环入队的元素)取出队列的元素,放入一维数组,并将该元素不为空的左右孩子入队。
  4. 每出一次循环就将一维数组存入二维数组。

解题代码

代码如下:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //结果数组
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root == null){
            return ret;//必须返回空的二维数组
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //每层数据
            List<Integer> level = new ArrayList<Integer>();
            int size = queue.size();
            //根据每层元素数循环
            while(size > 0){
                TreeNode cur = queue.poll();
                level.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.add(level);
        }
        return ret;
    }
}

从底层层序遍历

链接:二叉树的层序遍历II
跟头层序遍历一样,只需要将插入ret结果时变为头插即可。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root == null){
            return ret;//必须返回空的二维数组
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //每层数据
            List<Integer> level = new ArrayList<Integer>();
            int size = queue.size();
            //根据每层元素数循环
            while(size > 0){
                TreeNode cur = queue.poll();
                level.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.addFirst(level);
        }
        return ret;
    }
}

二叉树的最近公共祖先

链接:二叉树的最近公共祖先

题目描述

描述如下图:

解题思路

我们先思考有哪些情况:

  • 两个节点在其中一棵树的左右。
  • 两个节点有一个节点是祖先。

思路:

  1. 先看树是否为空,为空返回null。
  2. 判断当前根节点是不是所求节点。
  3. 左子树右子树找祖先。
  4. 根据得到情况判断:
  5. 如果当前根节点左右都得到值,那根节点就是共同祖先,对应情况一。
  6. 如果只有一方有值,那该值就是共同祖先,对应情况二。
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    	//树是否为空
        if(root == null){
            return null;
        }
        //根节点判断
        if(root == p || root == q){
            return root;
        }
        TreeNode retLeft = lowestCommonAncestor(root.left,p,q);
        TreeNode retRight = lowestCommonAncestor(root.right,p,q);
        if(retLeft != null && retRight != null){//根两边
            return root;
            //一个节点为祖先
        }else if(retRight == null){
            return retLeft;
        }else{
            return retRight;
        }
    }
}

从前序与中序遍历序列构建二叉树

链接:从前序与中序遍历序列构建二叉树

题目描述

解题思路

前序遍历得到的节点顺序是 根节点,左子树,右子树。
中序遍历得到的节点顺序是 左子树,根节点,右子树。

  1. 先从前序遍历结果从前往后依次拿到节点。
  2. 将该节点作为根节点然后依次创建左子树右子树(因为前序遍历是根左右)。
  3. 我们在中序遍历结果中根节点左边就是左子树包含节点,根节点右边就是右子树包含节点,所以创建子树时将范围给进去。

易错点:如果前序遍历的下标不是成员变量而是局部变量,那么每次递归拿到的都是0。

class Solution {
    private int preorderIndex;
    public TreeNode buildTree(int[] preorder, int[] inorder) {   
        return build(preorder,inorder,0,inorder.length-1);
    }
    public TreeNode build(int[] preorder, int[] inorder, int begin, int end) {
        //没有子树
        if(begin > end) {
            return null;
        }
        TreeNode root = new TreeNode(preorder[preorderIndex]);
        preorderIndex++;
        int rootIndex = findRootIndex(inorder,root.val,begin,end);
        root.left = build(preorder,inorder,begin,rootIndex - 1);
        root.right = build(preorder,inorder,rootIndex+1,end);
        return root;

    }
    private int findRootIndex(int[] inorder, int val,int begin, int end) {
        for(int i = begin; i <= end; i++){
            if(inorder[i] == val) return i;
        }
        return -1;
    }
}

从后序与中序遍历序列构建二叉树

题目描述

解题思路

中序遍历得到的节点顺序是 左子树,根节点,右子树。
后序遍历得到的节点顺序是 左子树,右子树,根节点。

依据前面的前序中序构建,我们只需要修改从后面开始遍历拿到后序遍历的结果在依次创建右子树,左子树即可。

class Solution {
    public int postorderIndex;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        postorderIndex = postorder.length - 1;
        return build(inorder,postorder,0,inorder.length-1);
    }
    private TreeNode build(int[] inorder, int[] postorder, int begin, int end) {
        if(begin > end) return null;
        TreeNode root = new TreeNode(postorder[postorderIndex]);
        postorderIndex--;
        int rootIndex = findRootIndex(inorder,root.val,begin,end);
        root.right = build(inorder,postorder,rootIndex+1,end);
        root.left = build(inorder,postorder,begin,rootIndex-1);
        return root;
    }
    private int findRootIndex(int[] inorder, int val,int begin, int end) {
        for(int i = begin; i <= end; i++){
            if(inorder[i] == val) return i;
        }
        return -1;
    }
}

根据二叉树创建字符串

根据二叉树创建字符串

题目描述


j

解题思路

节点有以下四种情况

  • 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号。
  • 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号。
  • 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号。
  • 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 ‘()’ 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。
class Solution {
    public String tree2str(TreeNode root) {
        StringBuilder str = new StringBuilder();
        //没节点
        if(root == null) {
            return "";
        }
        str.append(root.val);
        //没孩子
        if(root.left == null && root.right == null) {
            return str.toString();
        }
        //左孩子为空
        if(root.left == null) {
            str.append("()");
            str.append("(");
            str.append(tree2str(root.right));
            str.append(")");
            return str.toString();
        }
        //右孩子为空
        if(root.right == null) {
            str.append("(");
            str.append(tree2str(root.left));
            str.append(")");
            return str.toString();
        }
        str.append("(");
        str.append(tree2str(root.left));
        str.append(")");
        str.append("(");
        str.append(tree2str(root.right));
        str.append(")");

        return str.toString();
    }
}

标签:遍历,return,int,杨辉三角,null,root,节点,刷题
From: https://blog.csdn.net/yj20040627/article/details/140278874

相关文章

  • 反序列化刷题(一)
    反序列化刷题web255将isvip改为true然后序列化echourlencode($v=serialize($f=newctfShowUser()));Cookie:O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3......
  • Leetcode每日刷题之18.四数之和
    1.题目解析这里的18.四数之和与之前的三数之和有着异曲同工之妙,所以建议看完三数之和再来看本题,详细题目见Leetcode每日刷题之15.三数之和 ,只不过这里需要寻找的是四元组,也是不能寻找重复的四元组并且四元组内的数字可以按照任意顺序返回2.算法原理关于四数之和的思路......
  • 力扣刷题——3096.得到更多分数的最少关卡数目
    根据题意,假如alice选择完成第i关到第j关,那么bob需要完成第j+1关到第n关,其中i<=j<n。如此可以想到对关卡数组进行预处理,构建一个前缀和数组,保存假如从第0关每关都通过的话,到第i关所得到的分数。通过遍历一次前缀和数组,能够得到每个时刻alice得到的分数和bob得到的分数,当alice获得......
  • 【CTF刷题4】ctfshow刷题web部分wp(3)
    题目来源:ctfshow菜狗杯算力超群考点:抓包,eval()函数利用,漏洞利用打开发现是个计算器。一般碰到计算器就很容易和命令执行扯到一块。随便计算下然后抓个包发现是get方法,改参数让它报错。发现eval()函数。python语言,用危险函数eval()进行运算。这里我们使用沙......
  • 算法刷题记录 八十五【图论的广度优先搜索理论基础】
    前言图论章节第2篇。第1篇:记录八十二【图论理论基础及深度优先搜索算法】;本文:记录八十五【图论的广度优先搜索理论基础】一、广度优先搜索理论基础广度优先搜索理论基础参考链接1.1知识点框架1.2模拟广度搜索的过程在有向图中,以下图为例,如何进行广度优先搜索......
  • 打卡信奥刷题(574)用Scratch图形化工具信奥B2090[普及组/提高] 年龄与疾病
    年龄与疾病题目描述某医院进行一项研究,想知道某项疾病是否与年龄有关。因此对以往的诊断记录进行整理,统计0-18、19-35、36-60、61及以上这四个年龄段的患者人数占总患者人数的比例。输入格式输入共2......
  • 杭电基础100题(2000~2099)C++ 本萌新的刷题日记
    开始之前本人是刚学完C++基础语法的萌新,从B站了解到了杭电的100道水题基础题,于是打算开始刷题并在这里写下解题思路和一些想法,以便日后回顾,顺便分享给大家。我的计划是一天15题。这是我第一次在CSDN上发文章,还不是很熟悉怎么编辑。基本上每一题都会把代码和感想放这里。200......
  • Leetcode刷题笔记8.12-8.16
    Leetcode刷题笔记8.12-8.1619.删除倒数第n个链表结点(8.12)一个巧妙删除倒数第n个结点的trick该方法避免了对链表的一次全面扫描来获得总长度//返回链表的倒数第k个节点ListNodefindFromEnd(ListNodehead,intk){ListNodep1=head;//p1先走k步......
  • 打卡信奥刷题(568)用Scratch图形化工具信奥B2082[普及组/提高] B2083 画矩形
    画矩形题目描述根据输入的四个参数:a,b,c,f......
  • 面试鸭上线了!程序员在线面试刷题神器
    大家好,我是程序员鱼皮。耗时几个月,我们的新项目【面试鸭】已经正式上线了。上线后的鸭鸭是一个题目全面、命中率高、题解优质、持续更新的面试刷题神器!题库包括java基础,Java集合、Java并发编程,JVM,Spring,SpringBoot,微服务,Kafka,分布式,Redis,分布式事务,设计模式,算法......