一、前言
關於二叉樹的的基本操作以及初階的面試題在前面的部落格已經介紹完畢,這篇部落格用二叉樹這種資料結構來解決一些更加複雜的程式設計問題
二、二叉樹的層序遍歷
2.1 題目
給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值(即逐層地,從左到右訪問所有節點)。
示例:二叉樹:[3,9,20,null,null,15,7],
3
/ \9 20
/ \15 7
返回其層次遍歷結果:
[[3],
[9,20],
[15,7]
]2.2 實現原理
解決方法還是先序遍歷 加上乙個輔助引數 用來表示當前節點的層數 根據這個層數來決定這個節點應該在哪行
2.3 **實現
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
//最好加上clear 防止多組資料的操作
result.
clear()
;leveloderhelper
(root,0)
;return result;
}private
void
leveloderhelper
(treenode root,
int level)
list
currow=result.
get(level)
; currow.
add(root.val)
;//先序遍歷的"訪問操作"
if(root.left!=null)
if(root.right!=null)
}}
三、二叉樹的層序遍歷
3.1 實現原理
① 借助佇列 , 不是遞迴
② 迴圈執行以下操作 :
a 取出隊首元素
b 訪問這個該元素
c 把當前元素的左子樹和右子樹分別入佇列
d 隊列為空就是遍歷完畢
3.2 **實現
public
void
levelorder
(node root)
//1.建立乙個佇列
queue
queue =
newlinkedlist
<
>()
; queue.
offer
(root)
;//2.進入迴圈,迴圈結束條件為隊列為空
while
(!queue.
isempty()
)if(cur.right!=null)
}}
四、判斷一棵樹是不是完全二叉樹
4.1 實現原理
① 基於層序遍歷實現的
② 有兩個階段 , 針對這個樹進行層序遍歷 :
a.要求每個訪問到的節點必須具備兩個子樹,
b.如果遇到某個節點沒有子樹 , 或者只有左子樹就進入第二階 , 如果只有右子樹判定完畢 , 這個樹不是完全二叉樹
c.第二階段要求訪問到的節點必須沒有子樹 , 如果有子樹就不是完全二叉樹
d.直到遍歷結束也沒有找到不符合要求的節點 , 這個樹就是完全二叉樹
4.2 **實現
public
boolean
iscomplete
(node root)
//這個變數為true 表示當前在第一階段 為false就是第二階段
boolean isfirststep=
true
;//針對這個樹進行層序遍歷
queue
queue=
newlinkedlist
<
>()
; queue.
offer
(root)
;while
(!queue.
isempty()
)else
if(cur.left==null&&cur.right!=null)
else
if(cur.left!=null&&cur.right==null)
else
}else}}
//樹遍歷完也沒有找到反例就是完全二叉樹
return
true
;}
五、二叉樹的構建及遍歷
5.1 題目
要求中序遍歷輸出結果 , 並且每個元素之間必須使用空格來分割 , 題目給出的先序遍歷是包含空樹的結果如abd###c##
5.2 實現原理
不包含空樹的先序遍歷結果無法構建一棵樹 , 二叉樹還原的過程本質上還是進行先序遍歷 , 訪問元素的過程就是建立節點
5.3 **實現
public
class
main
}public
static
void
main
(string[
] args)
}private
static
void
inorder
(treenode root)
inorder
(root.left)
; system.out.
print
(root.val+
" ")
;inorder
(root.right);}
private
static
int index=0;
//幫助我們在遞迴中記住當前處理到哪個字元
//入口
/*private static treenode buildtree(string line)*/
//輔助遞迴方法
//每遞迴一次就處理乙個節點(從字串中取出乙個指定字元)
private
static treenode creattreepreorder
(string line)
//如果節點非空,就可以訪問這個節點 訪問操作就是建立節點
treenode node =
newtreenode
(ch)
; index++
;//為了處理下乙個節點
node.left=
creattreepreorder
(line)
; index++
;//再去處理下乙個節點
node.right=
creattreepreorder
(line)
;return node;
}}
這是第一部分關於二叉樹高階面試題的總結,將會持續更新這一資料結構的相關題型~ 保安日記之二叉樹高階面試題 下
一 前言 關於二叉樹的的基本操作以及初階的面試題在前面的部落格已經有所描述,這篇關於二叉樹資料結構的最終篇部落格就來簡單介紹一下用非遞迴的方式來實現二叉樹的前序 中序 後序遍歷 二 二叉樹的非遞迴實現先序遍歷 2.1 實現原理 一般非遞迴方式實現遞迴操作都需要用到棧 先序遍歷 1 創造乙個棧 初始情...
二叉樹面試題 上
思路 利用陣列把二叉樹用 表示出來,例如建立下面這顆樹 int a 傳參時把陣列名 陣列下標以及非法值傳過去。invalid是 的ascll碼值,代表null,如果某節點的左右孩子都是 那他就是葉子。建立使用的是遞迴法,具體 實現如下 ps 此處傳陣列下標採用的是傳址方式,因為遞迴法會有多層函式棧幀...
二叉樹面試題
1.求二叉樹節點個數 可以使用遞迴解決。將問題分解為求根節點 左子樹的節點數 右節點的節點數。實現 public size t size private size t size node root 2.求頁節點個數 頁節點 左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點...