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)。
變形一
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 求二叉树的层序遍历(变形更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BM22 比较版本号
- 下一篇: 初学Ajax相关知识