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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BM26 求二叉树的层序遍历(变形更新中)

發布時間:2024/9/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BM26 求二叉树的层序遍历(变形更新中) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

給定一個二叉樹,返回該二叉樹層序遍歷的結果,(從左到右,一層一層地遍歷)
例如:
給定的二叉樹是{3,9,20,#,#,15,7},


該二叉樹層序遍歷的結果是
[
[3],
[9,20],
[15,7]

]

提示:

0 <= 二叉樹的結點數 <= 1500

示例1

輸入:

{1,2}

返回值:

[[1],[2]]

示例2

輸入:

{1,2,3,4,#,#,5}

返回值:

[[1],[2,3],[4,5]]

代碼:

復雜度分析:
時間復雜度:O(n),每個點進隊出隊各一次,遍歷了整個二叉樹。
空間復雜度:O(n),隊列中元素的個數不超過 n 個,所以空間復雜度為 O(n)。

import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* }*/ import java.util.Deque; public class Solution {/*** * @param root TreeNode類 * @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {// write code hereDeque<TreeNode> dq=new LinkedList<>();ArrayList<ArrayList<Integer>> al=new ArrayList<ArrayList<Integer>>();if(root==null){return al;}dq.offer(root); //進隊列while(!dq.isEmpty()){ArrayList<Integer> list=new ArrayList<>(); //臨時存儲該層節點int size=dq.size(); //這一層有多少個節點for(int i=0;i<size;i++){TreeNode temp=dq.peek(); //取隊列第一個節點list.add(temp.val); //將隊列出的節點值存儲到list中dq.poll(); //出隊列if(temp.left!=null){dq.offer(temp.left);}if(temp.right!=null){dq.offer(temp.right);}}al.add(list); //將這一層的所有的節點全部存儲到一個總的list中}return al;} }

變形一

BM35?判斷是不是完全二叉樹

描述

給定一個二叉樹,確定他是否是一個完全二叉樹。

完全二叉樹的定義:若二叉樹的深度為 h,除第 h 層外,其它各層的結點數都達到最大個數,第 h 層所有的葉子結點都連續集中在最左邊,這就是完全二叉樹。(第 h 層可能包含 [1~2h] 個節點)

數據范圍:節點數滿足1≤n≤100?

樣例圖1:

樣例圖2:

示例1

輸入:

{1,2,3,4,5,6}

返回值:

true

示例2

輸入:

{1,2,3,4,5,6,7}

返回值:

true

題解:

思路:借助層序遍歷

只有x,x,x,#,#,#這樣的才是完全二叉樹

如果出現x,#,y,#,#,#或者x,#,#,x,#,#,#證明不是完全二叉樹

碰到第一個#的時侯令flag=true

如果再次碰到非#結點,且flag=true時候,說明不是完全二叉

?import java.util.*;/** public class TreeNode {* int val = 0;* TreeNode left = null;* TreeNode right = null;* public TreeNode(int val) {* this.val = val;* }* }*/public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param root TreeNode類 * @return bool布爾型*/public boolean isCompleteTree (TreeNode root) {// write code hereif(root==null)return true;Deque<TreeNode> dq=new LinkedList<>();dq.offer(root);boolean flag=false; //這個flag用來判斷前面是否已經有空節點boolean res=true;while(!dq.isEmpty()){int size=dq.size();for(int i=0;i<size;i++){TreeNode temp=dq.poll();if(temp==null){ //由于進入隊列沒有判別左右子樹是否為空,所以可能是空值//這里表示當前的節點為空,則如果后面還有節點的話,則不是一顆二叉樹 flag=true; //該節點為空}else{ //該節點不為空if(flag){ //前面已經出現了空節點,后面如果還有節點,則直接返回不是二叉樹return false;}dq.offer(temp.left); //不管該節點的左右節點是否為空,都進入了隊列dq.offer(temp.right); //不管該節點的左右節點是否為空,都進入了隊列}}}return true; //遍歷完,是完全二叉樹} }?

變形二?

BM41?輸出二叉樹的右視圖

描述

請根據二叉樹的前序遍歷,中序遍歷恢復二叉樹,并打印出二叉樹的右視圖

數據范圍: 0≤n≤10000
要求: 空間復雜度 O(n),時間復雜度?O(n)

如輸入[1,2,4,5,3],[4,2,5,1,3]時,通過前序遍歷的結果[1,2,4,5,3]和中序遍歷的結果[4,2,5,1,3]可重建出以下二叉樹:

所以對應的輸出為[1,3,5]。

示例1

輸入:

[1,2,4,5,3],[4,2,5,1,3]

返回值:

[1,3,5]

題解思路:

在層次遍歷基礎之上的題目,右視圖就是遍歷每一層將每一層最后一位元素保存在數組中返回即可。

import java.util.*;public class Solution {/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可* 求二叉樹的右視圖* @param xianxu int整型一維數組 先序遍歷* @param zhongxu int整型一維數組 中序遍歷* @return int整型一維數組*///構建的樹的結構public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}//根據中序和前序構建二叉樹public TreeNode con(int[] xianxu, int[] zhongxu){if(xianxu.length==0||zhongxu.length==0){return null;}TreeNode root=new TreeNode(xianxu[0]);for(int i=0;i<zhongxu.length;i++){if(root.val==zhongxu[i]){root.left=con(Arrays.copyOfRange(xianxu,1,i+1),Arrays.copyOfRange(zhongxu,0,i));root.right=con(Arrays.copyOfRange(xianxu,i+1,xianxu.length),Arrays.copyOfRange(zhongxu,i+1,zhongxu.length));break;}}return root;}public int[] solve (int[] xianxu, int[] zhongxu) {// write code hereif(xianxu.length==0||zhongxu.length==0){return null;}//構建二叉樹TreeNode root=con(xianxu,zhongxu); //層序遍歷二叉樹,每遍歷一層,就把該層的最后一個節點加入list中ArrayList<Integer> list=new ArrayList<>();Deque<TreeNode> dq=new LinkedList<>();dq.offer(root);while(!dq.isEmpty()){int size=dq.size();for(int j=0;j<size;j++){ //遍歷該層的所有節點TreeNode temp=dq.poll();if(j==size-1){ //最后一個節點list.add(temp.val);}if(temp.left!=null){dq.offer(temp.left);}if(temp.right!=null){dq.offer(temp.right);}}} int[] arr=new int[list.size()]; //新建數組for(int i=0;i<list.size();i++){ //轉移數組arr[i]=list.get(i);}return arr; } }

總結

以上是生活随笔為你收集整理的BM26 求二叉树的层序遍历(变形更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。