首页 > 其他分享 >Day11 二叉树 part01| LeetCode

Day11 二叉树 part01| LeetCode

时间:2024-09-09 23:14:58浏览次数:8  
标签:tmp TreeNode part01 List 二叉树 new root LeetCode result

理论基础

  • 二叉树的种类

    • 满二叉树
    • 完全二叉树
    • 二叉搜索树
    • 平衡二叉搜索树
  • 存储方式:数组、链式

  • 二叉树的遍历方式

    • 深度优先遍历
      • 前序(递归法、迭代法)
      • 中序(递归法、迭代法)
      • 后序(递归法、迭代法)
    • 广度优先遍历
      • 层序(迭代法)
  • 二叉树的定义

 public class TreeNode{
       int val;
       TreeNode left;
       TreeNode right;

       TreeNode() {}
       TreeNode(int val) { this.val=val;}

       TreeNode(int val,TreeNode left,TreeNode right)
       {
           this.val=val;
           this.left=left;
           this.right=right;
       }

   }

递归遍历

递归三要素

  • 确定递归函数的参数和返回值
  • 确定终止条件
  • 确定单层递归的逻辑

144. 二叉树的前序遍历

 class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
                // 前序遍历:中左右
            List<Integer> result=new ArrayList<Integer>();
            pre(root,result);
            return result;

        }
        public void pre(TreeNode root,List<Integer> result)
        {
            if(root==null)
                return;
            result.add(root.val);
            pre(root.left,result);
            pre(root.right,result);

        }

    }

145. 二叉树的后序遍历

class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
                // 中序遍历:左中右
            List<Integer> result=new ArrayList<Integer>();
            inorder(root,result);
            return result;

        }
        public void inorder(TreeNode root,List<Integer> result)
        {
            if(root==null)
                return;
            inorder(root.left,result);
            result.add(root.val);

            inorder(root.right,result);

        }

    }

94. 二叉树的中序遍历

 class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
                // 后序遍历:左右中
            List<Integer> result=new ArrayList<Integer>();
            postorder(root,result);
            return result;

        }
        public void postorder(TreeNode root,List<Integer> result)
        {
            if(root==null)//递归终止条件
                return;

            postorder(root.left,result);
            postorder(root.right,result);
            result.add(root.val);

        }

    }

层序遍历

  • 队列实现层序遍历:先进先出

二叉树的层序遍历

102.二叉树的层序遍历(opens new window)

  • 迭代法
  class Solution {
       public List<List<Integer>> reList=new ArrayList<List<Integer>>();
            public List<List<Integer>> levelOrder(TreeNode root) {
                check(root);
                return reList;

            }
            public  void check(TreeNode node){

                //判空
                if(node==null)
                    return;

                Queue<TreeNode> q=new LinkedList<TreeNode>();
                    //根节点 入队
                 q.offer(node);
                 while(!q.isEmpty())
                 {
                     List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                     int lens=q.size();
                     while(lens>0)
                     {
                         TreeNode tmp=q.poll();//出队
                         itemlist.add(tmp.val);
                         if(tmp.left!=null)
                         {
                             q.offer(tmp.left);
                         }
                         if(tmp.right!=null)
                         {
                             q.offer(tmp.right);
                         }

                         lens--;

                     }
                     reList.add(itemlist);
                 }


            }

        }
  • 递归法
class Solution {
       public List<List<Integer>> reList=new ArrayList<List<Integer>>();
            public List<List<Integer>> levelOrder(TreeNode root) {
                check(root,0);
                return reList;

            }
            public  void check(TreeNode node,int deep) {
                if(node==null) return;//终止条件

                deep++;

                if(reList.size()<deep)
                {
                    List<Integer> itemlist=new ArrayList<>();

                    reList.add( itemlist);
                }
                reList.get(deep-1).add(node.val);//根据索引寻找对应层数
                check(node.left,deep);
                check(node.right,deep);
            }

        }

二叉树的层次遍历II

107.二叉树的层次遍历II(opens new window)

class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            check(root);

            
            //翻转
            List<List<Integer>> result=new ArrayList<List<Integer>>();
            
            for(int i=reList.size()-1;i>=0;i--)
            {
                result.add(reList.get(i));
            }
            return result;

        }
        public  void check(TreeNode node){

            //判空
            if(node==null)
                return;

            Queue<TreeNode> q=new LinkedList<TreeNode>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    TreeNode tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        q.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        q.offer(tmp.right);
                    }

                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

二叉树的右视图

199.二叉树的右视图(opens new window)

class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public List<Integer> rightSideView(TreeNode root) {
            check(root);



            List<Integer> result=new ArrayList<Integer>();

            for(int i=0;i<reList.size();i++)
            {
                int lens=reList.get(i).size();//每层的个数
                result.add(reList.get(i).get(lens-1));//每层的最后一个

            }
            return result;

        }
        public  void check(TreeNode node){

            //判空
            if(node==null)
                return;

            Queue<TreeNode> q=new LinkedList<TreeNode>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    TreeNode tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        q.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        q.offer(tmp.right);
                    }

                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

二叉树的层平均值

637.二叉树的层平均值(opens new window)

class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public List<Double> averageOfLevels(TreeNode root) {
            check(root);
            List<Double> result=new ArrayList<>();

            for(int i=0;i<reList.size();i++)
            {

                int lens=reList.get(i).size();//每层的个数
                double itemSum=0;
                for(int j=0;j<lens;j++)
                {
                    itemSum+=reList.get(i).get(j);
                }
                result.add(itemSum/lens);

            }

            return result;
        }
        public  void check(TreeNode node){

            //判空
            if(node==null)
                return;

            Queue<TreeNode> q=new LinkedList<TreeNode>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    TreeNode tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        q.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        q.offer(tmp.right);
                    }

                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

N叉树的层序遍历

429.N叉树的层序遍历(opens new window)

class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public List<List<Integer>> levelOrder(Node root) {
            check(root);

          return reList;
        }
        public  void check(Node node){

            //判空
            if(node==null)
                return;

            Queue<Node> q=new LinkedList<Node>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    Node tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    List<Node> children=tmp.children;
                 /*   if(children==null||children.size()==0)
                    {
                        continue;
                    }*/
                    for(Node child:children)
                    {
                        if(child!=null)
                        {
                            q.offer(child);
                        }
                    }



                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

在每个树行中找最大值

515.在每个树行中找最大值(opens new window)

 class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public List<Integer> largestValues(TreeNode root) {
            check(root);
            List<Integer> result=new ArrayList<>();

            for(int i=0;i<reList.size();i++)
            {
                int lens=reList.get(i).size();
                int max=reList.get(i).get(0);

                for(int j=1;j<lens;j++)
                {
                   if(reList.get(i).get(j)>max)
                   {
                       max=reList.get(i).get(j);
                   }
                }
                result.add(max);
            }
            return result;

        }
        public  void check(TreeNode node){

            //判空
            if(node==null)
                return;

            Queue<TreeNode> q=new LinkedList<TreeNode>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    TreeNode tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        q.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        q.offer(tmp.right);
                    }

                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

填充每个节点的下一个右侧节点指针

116.填充每个节点的下一个右侧节点指针(opens new window)


节点的下一个右侧节点指针II

117节点的下一个右侧节点指针II(opens new window)


二叉树的最大深度

104.二叉树的最大深度(opens new window)

 class Solution {
        public List<List<Integer>> reList=new ArrayList<List<Integer>>();
        public int maxDepth(TreeNode root)  {
            check(root);
            return reList.size();

        }
        public  void check(TreeNode node){

            //判空
            if(node==null)
                return;

            Queue<TreeNode> q=new LinkedList<TreeNode>();
            //根节点 入队
            q.offer(node);
            while(!q.isEmpty())
            {
                List<Integer> itemlist=new ArrayList<Integer>();//存放每层节点
                int lens=q.size();
                while(lens>0)
                {
                    TreeNode tmp=q.poll();//出队
                    itemlist.add(tmp.val);
                    if(tmp.left!=null)
                    {
                        q.offer(tmp.left);
                    }
                    if(tmp.right!=null)
                    {
                        q.offer(tmp.right);
                    }

                    lens--;

                }
                reList.add(itemlist);
            }


        }

    }

二叉树的最小深度

111.二叉树的最小深度


标签:tmp,TreeNode,part01,List,二叉树,new,root,LeetCode,result
From: https://www.cnblogs.com/FreeDrama/p/18405572

相关文章

  • LeetCode题集-3 - 无重复字符的最长子串
    题目:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。我们先来好好理解题目,示例1中怎么得到长度为3的?如果以第一个字符a为起始,不含重复的最长子串是abc;则我们这样表示(a)bcabcbb->(abc)abcbb,如此表达枚举出所有可能的情况如下:1.(a)bcabcbb->(abc)abcbb;2.a......
  • C ++ 从单链表到创建二叉树到二叉树的遍历(结构体)
    首先我们要了解二叉树的数据结构是什么,本质上二叉树是一个有两个节点的链表,我们先了解的单链表的相关定义单链表创建一个朴素的单链表#include<iostream>usingnamespacestd;structNode{intval;Node*next;Node(intx):val(x),next(nullptr){}......
  • 【Leetcode算法面试题】-1. 两数之和
    文章目录算法练习题目思路参考答案算法1算法2算法3算法练习面试经常会遇到算法题目,今天开启算法专栏,常用算法解析题目**给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设......
  • 24暑假算法刷题 | Day41 | 动态规划 IX | LeetCode 188. 买卖股票的最佳时机 IV,309.
    目录188.买卖股票的最佳时机IV题目描述题解309.买卖股票的最佳时机含冷冻期题目描述题解714.买卖股票的最佳时机含手续费题目描述题解188.买卖股票的最佳时机IV点此跳转题目链接题目描述给你一个整数数组prices和一个整数k,其中prices[i]是某支给定......
  • LeetCode 239. 滑动窗口最大值(滑动窗口)
    题目:239.滑动窗口最大值思路:用一个双端队列来保存滑动窗口内的值按大到小排序,时间复杂度0(n)。细节看注释classSolution{public:vector<int>maxSlidingWindow(vector<int>&nums,intk){ //元素值是nums的下标,满足nums值按大到小排序deque<in......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......
  • LeetCode 刷题—集合
    一:集合1、特点:元素没有顺序;不重复2、集合可以用来检擦某个元素是否存在;或者检查是否从在重复的元素3、常见的操作:#创建集合my_set={1,2,3,4,5}#添加元素my_set.add(6)#访问元素(集合是无序的;不能通过下标索引访问元素;只能通过遍历访问元素)foriinmy_set:print(i)#......
  • 0906, 0909 shell编程与基础算法(leetCode )
    0906哈希表的基本知识:哈希表(HashTable)又称散列表,是除顺序存储结构、链式存储结构和索引表存储结构之外的又一种存储结构。哈希碰撞:解决办法开放定址法:是一类以发生冲突的哈希地址为自变量,通过某种哈希冲突函数得到一个新的空闲的哈希地址的方法。(1)线性探测法从发生......
  • LeetCode刷题笔记9.2-9.9
    leetCode刷题笔记(9.2-9.9)48.旋转图像(9.3)1)图像即二维数组,图像的旋转本质上是二维数组的旋转变换2)二维数组从外层来看,是若干个子数组的集合,子数组内部维护各自的元素,即若干个row里是row.length个column3)由此可理解下面几个关于二维数组的函数:创建二维数组并初始化int[][]......
  • 【JavaScript】LeetCode:16-20
    文章目录16无重复字符的最长字串17找到字符串中所有字母异位词18和为K的子数组19滑动窗口最大值20最小覆盖字串16无重复字符的最长字串滑动窗口+哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新......