首页 > 其他分享 >杨辉三角。。

杨辉三角。。

时间:2024-09-21 17:49:51浏览次数:6  
标签:遍历 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/142420962

相关文章

  • 【刷题】杨辉三角
    目录杨辉三角题目描述解题思路解题代码相同的树题目描述解题思路二叉树的层序遍历题目描述解题思路解题代码从底层层序遍历二叉树的最近公共祖先题目描述解题思路从前序与中序遍历序列构建二叉树题目描述解题思路从后序与中序遍历序列构建二叉树题目描述解题思路根......
  • DHU OJ 二维数组 杨辉三角
    思路及代码//inputT,int1<=<=20//inputT组n#include<iostream>usingnamespacestd;intmain(){intT;cin>>T;intn;//createn=20杨辉三角int**p=newint*[20];for(inti=0;i<=19;i++){p[i]=new......
  • 杨辉三角 C++实现
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。classSolution{public:vector<vector<int>>generate(intnumRows){vector<vector<int>>vv;vv.resize(numRows);......
  • 杨辉三角的奥秘
    在数学的浩瀚宇宙中,杨辉三角,这一古老而璀璨的数学瑰宝,以其独特的形态和深刻的内涵,跨越了世纪的界限,继续在多个数学领域及实际应用中闪耀着智慧的光芒。杨辉三角的精妙构造:它以等腰三角形的优雅姿态,层层铺展,每一行都承载着数字的奥秘。起始于孤零而庄严的“1”,随后每一层都以......
  • 利用chatgpt3.5/4.0生成一个generator,完成杨辉三角
    deftriangles():row=[1]whileTrue:yieldrowrow=[sum(x)forxinzip([0]+row,row+[0])]#期待输出:#[1]#[1,1]#[1,2,1]#[1,3,3,1]#[1,4,6,4,1]#[1,5,10,10,5,1]#[1,6,15,20,15,6,1]#[1,7,......
  • 杨辉三角打印10行
    1publicclassshuzu10{2//编写一个main方法3publicstaticvoidmain(String[]args){45/*617118121913311014641111510......
  • 用C语言打印杨辉三角形:**
    用C语言打印杨辉三角形:1.杨辉三角形规律:1.每行数字左右对称,由1开始逐渐变大,然后变小,回到1。2.第n行的数字个数等于n,第n行的第一个和最后一个数字都是1。3.对于第i行,除首尾两个1之外,任意位置的数等于它肩上的两个数之和。即第i行第j个数等于第i-1行第j-1个数与第i-1行第......
  • 杨辉三角讲解
    一、背景(阅读时可略过)(1)杨辉其人杨辉,字谦光,杭州人,中国南宋时期杰出的数学家和数学教育家。他是世界上第一个排出丰富的纵横图和讨论其构成规律的数学家。著有《详解九章算法》、《日用算法》、《乘除通变本末》、《田亩比类乘除捷法》、《续古摘奇算法》。杨辉的数学研究与教......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)05——数组(语法,赋值机制,拷贝反转)、排序(冒泡排
    文章目录前言一、数组1.基础语法1)介绍2)使用(动态、静态初始化语法与使用)3)注意事项和细节2.数组赋值机制(ArryAssign)3.数组拷贝4.数组反转(reserve)5.数组的扩容与缩减二、排序三、查找四、二维数组(TwoDimensionalArry)1.快速入门2.使用3.案例:打印一个10行的......
  • 华为OD机考题(HJ53 杨辉三角的变形)
    前言经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。描述以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。求第n行第一个偶数出现的位置。如果没有偶数,......