今天面試,被問到了二叉樹的深度計算問題。
一聽到這個問題,第一反應是大學被寫爛了的基本資料結構問題。
然而我已經畢業3年,沒寫演算法很久,手都生了。但是呢,不能說生了就只對面試官說思路吧,於是還是不假思索的立馬拿起筆,寫了起來,畢竟這是乙個基本的資料結構題目。
首先立馬寫了乙個二叉樹結構。
public class binarytree
一寫出來,立馬有了感覺。順勢寫了計算方法
public int computetreedepth(binarytree binarytree)
int ldepth = computetreedepth(binarytree.lchild);
int rdepth = computetreedepth(binarytree.rchild);
return math.max(ldepth, rdepth);
}
然後就給面試官看了。
面試官問我有感覺**不對嗎?哎,只怪我太久沒寫演算法題了,連這個基本的深度計算,都出現簡單失誤。更可氣的是在當時的緊張環境下,我竟然沒有發現**問題。後來經過面試官提醒,也終於改了過來。
public int computetreedepth(binarytree binarytree)
if(binarytree.lchild == null && binarytree.rchild == null)
int ldepth = computetreedepth(binarytree.lchild) + 1;
int rdepth = computetreedepth(binarytree.rchild) + 1;
return math.max(ldepth, rdepth);
}
此時我的心裡一萬個對自己無語,竟然在面試的時候出現這麼大的失誤(不過也只怪我平常自從畢業就很少去深入寫演算法題了,以後一定要注意)
這個時候,面試官說這是遞迴實現,寫一下非遞迴實現。
當時心裡無語的我頓時一塞,非遞迴實現,然後一想,也簡單。然後就屁顛屁顛的開始寫起來。寫著寫著我發現,情況似乎不是我想的這麼簡單。隨著時間的深入,我的心裡變得異常緊張,結果硬是在那幾分鐘沒想出來。此刻真是深深的鄙視自己,無論是什麼原因讓我當時的大腦短路了,終究的結果是我沒寫出來非遞迴實現。之後面試官委婉的叫我下去在思考這個問題吧。
總結一下:
問題:自己當時太想著展現自己,導致自己的思路太過緊湊反而限制了我的思維,導致這個簡單的問題也寫出漏洞,甚至連非遞迴實現最後沒編寫出來。
對自己的思考:
1.作為程式猿,平常還是要多鍛鍊自己的演算法編寫習慣,多去思考。只有這樣才可以在面試中對演算法題有乙個較好的把控。
2.面試的時候心態要放平穩,不能心浮氣躁,導致自己出現各種臨時小問題。因為對方只會看結果。
回來了,自己重新寫了一遍二叉樹的深度計算實現,果然很簡單。記錄一下吧,就當是自己前進的路上的乙個絆腳石,也希望自己在每一次總結之後能進步自己。
多思考,多學習,放平心態,去面對每乙個新技術,新思維。
下面貼**
二叉樹深度計算的遞迴實現:
public int computetreedepth(binarytree binarytree)
return math.max(computetreedepth(binarytree.lchild), computetreedepth(binarytree.rchild)) + 1;
}
二叉樹深度計算的非遞迴實現:
首先想到是直接遍歷,如果是直接遍歷那自然就有兩種思路,廣度優先和深度優先。
public int computetreedepth(binarytree binarytree)
//將根加入佇列
mvisitlist.offer(binarytree);
while (!mvisitlist.isempty())
if(tmp.rchild != null)}}
return depth;
}
然後深度優先,因為是深度遍歷那肯定是先進後出,採用棧實現,然後遍歷思路是先遍歷當前節點的左子樹,沒有左子樹到情況在遍歷右子樹:
public int computetreedepth(binarytree binarytree)
//當前節點沒有子樹,直接更新最大深度(訪問到當前節點到深度是棧的深度+1)
depth = math.max(depth, mvisitlist.size() + 1);
//此時回溯去找右子樹
while (!mvisitlist.isempty())
//說明當前棧頂節點的右子樹為空,直接出棧,繼續回溯
// 且要更新當前節點,用於記錄當前正在回溯的節點,避免死迴圈回溯
tmp = mvisitlist.pop();}}
return depth;
}
二叉樹 建立 遍歷 計算深度 計算節點個數
include define max x,y x y x y typedef char elementtype struct node node btree 先序序列建立二叉樹 char str abd g ce f void createpreorder node root root new no...
計算二叉樹的深度
給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的深度。輸入格式 輸入首先給出正整數n 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出格式 輸出為乙個整數,即該二叉樹的高度。輸入樣例 9 abdfghiec fdhgi...
二叉樹的深度 二叉樹的深度
題目描述輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。及測試用例 單步除錯檢視過程 public class solution19 拿到左子樹的最大深度 int leftdep treedepth root.left 拿到右子...