日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 102二叉树的层序遍历103二叉树锯齿形遍历104二叉树的最大深度

發(fā)布時(shí)間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 102二叉树的层序遍历103二叉树锯齿形遍历104二叉树的最大深度 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信搜一搜:bigsai
大家都在關(guān)注的刷題、學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法寶藏項(xiàng)目
關(guān)注回復(fù)進(jìn)群即可加入力扣打卡群,歡迎劃水。近期打卡:
LeetCode 97交錯(cuò)字符串(動(dòng)態(tài)規(guī)劃)
LeetCode 98驗(yàn)證二叉搜素樹(shù)(中序遍歷)&99恢復(fù)二叉搜索樹(shù)
LeetCode 100相同的樹(shù)&101對(duì)稱(chēng)二叉樹(shù)

二叉樹(shù)的層序遍歷

給你一個(gè)二叉樹(shù),請(qǐng)你返回其按 層序遍歷 得到的節(jié)點(diǎn)值。 (即逐層地,從左到右訪問(wèn)所有節(jié)點(diǎn))。

示例:
二叉樹(shù):[3,9,20,null,null,15,7],

3/ \9 20/ \15 7 返回其層序遍歷結(jié)果:[[3],[9,20],[15,7] ]

分析
二叉樹(shù)層序遍歷過(guò)程詳細(xì)看這篇,直接套魔板即可。

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>>list=new ArrayList<List<Integer>>();if(root==null)return list;Queue<TreeNode>q1=new ArrayDeque<TreeNode>();q1.add(root);while (!q1.isEmpty()) {int size=q1.size();List<Integer>value=new ArrayList<Integer>();for(int i=0;i<size;i++){TreeNode pNode=q1.poll();if(pNode.left!=null)q1.add(pNode.left);if(pNode.right!=null)q1.add(pNode.right);value.add(pNode.val);}list.add(value);}return list;} }

二叉樹(shù)鋸齒形遍歷

給定一個(gè)二叉樹(shù),返回其節(jié)點(diǎn)值的鋸齒形層序遍歷。(即先從左往右,再?gòu)挠彝筮M(jìn)行下一層遍歷,以此類(lèi)推,層與層之間交替進(jìn)行)。

例如:

給定二叉樹(shù) [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回鋸齒形層序遍歷如下:[[3],[20,9],[15,7] ]

分析:
就是一個(gè)特殊的層序遍歷。更換層的時(shí)候需要更換節(jié)點(diǎn)順序,這需要我們用兩個(gè)內(nèi)存空間配合達(dá)到分清奇偶的目的。這里有的是從左到右,有的是從右到左,理論上可以借助棧將集合的元素反轉(zhuǎn)但是沒(méi)必要。我用兩個(gè)List集合直接剛就行了。
首先進(jìn)行分析:

  • 第一行從左到右,第二行從右到左,第三行從左到右。兩個(gè)list裝的是節(jié)點(diǎn),而還需要每次遍歷根據(jù)奇數(shù)和偶數(shù)的特性將節(jié)點(diǎn)裝起來(lái)。
  • (普遍方法)你可以全部按照正常的順序分層裝起來(lái),只不過(guò)如果偶數(shù)層遍歷的時(shí)候從右往左加進(jìn)結(jié)果集合。比較好想,容易操作,但是偶數(shù)層在添加節(jié)點(diǎn)時(shí)候不能同時(shí)遍歷。
  • 但是筆者瞎搞發(fā)現(xiàn)一個(gè)規(guī)律。全部從右往左遍歷。只不過(guò)在奇數(shù)行先添加(左后右)。而偶數(shù)行進(jìn)行右左添加,相當(dāng)于這個(gè)順序操作一次被顛倒一次,每次添加節(jié)點(diǎn)都可以直接訪問(wèn)而不需要單獨(dú)的訪問(wèn)。(這個(gè)方法可能復(fù)雜了上面一條其實(shí)就可以了)

實(shí)現(xiàn)代碼為:

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>>list=new ArrayList<List<Integer>>();if(root==null)return list;ArrayList<TreeNode>nodelist1=new ArrayList<TreeNode>();//用來(lái)模擬堆棧用ArrayList<TreeNode>nodelist2=new ArrayList<TreeNode>();nodelist1.add(root);int num=1;//做奇數(shù)偶數(shù)while (!nodelist1.isEmpty()||!nodelist2.isEmpty()) {ArrayList<Integer>team=new ArrayList<Integer>();if(num%2==1) {for(int i=nodelist1.size()-1;i>=0;i--){TreeNode teamNode=nodelist1.get(i);team.add(teamNode.val);if(teamNode.left!=null)nodelist2.add(teamNode.left);if(teamNode.right!=null)nodelist2.add(teamNode.right);}nodelist1.clear();}else {for(int i=nodelist2.size()-1;i>=0;i--){TreeNode teamNode=nodelist2.get(i);team.add(teamNode.val);if(teamNode.right!=null)nodelist1.add(teamNode.right);if(teamNode.left!=null)nodelist1.add(teamNode.left);}nodelist2.clear();}list.add(team);num++;}return list;} }

二叉樹(shù)的最大深度

給定一個(gè)二叉樹(shù),找出其最大深度。

二叉樹(shù)的深度為根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的最長(zhǎng)路徑上的節(jié)點(diǎn)數(shù)。

說(shuō)明: 葉子節(jié)點(diǎn)是指沒(méi)有子節(jié)點(diǎn)的節(jié)點(diǎn)。

示例:

給定二叉樹(shù) [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最大深度 3 。

分析
可以使用二叉樹(shù)的遍歷同時(shí)記錄深度,保存最大的深度即可。
具體代碼為:

/*** Definition for a binary tree node.* 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;* }* }*/ class Solution {int maxhigh;public int maxDepth(TreeNode root) {maxDepth(root,0);return maxhigh;}private void maxDepth(TreeNode root, int high) {// TODO Auto-generated method stubif(high>maxhigh)maxhigh=high;if(root==null)return ;else {maxDepth(root.left, high+1);maxDepth(root.right, high+1);}} }

原創(chuàng)不易,bigsai請(qǐng)你幫兩件事幫忙一下:

  • star支持一下, 您的肯定是我在平臺(tái)創(chuàng)作的源源動(dòng)力。

  • 微信搜索「bigsai」,關(guān)注我的公眾號(hào),不僅免費(fèi)送你電子書(shū),我還會(huì)第一時(shí)間在公眾號(hào)分享知識(shí)技術(shù)。加我還可拉你進(jìn)力扣打卡群一起打卡LeetCode。

  • 記得關(guān)注、咱們下次再見(jiàn)!

    總結(jié)

    以上是生活随笔為你收集整理的LeetCode 102二叉树的层序遍历103二叉树锯齿形遍历104二叉树的最大深度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。