叉樹是一種數據結構,是由結點個數大于或等于0的結點所構成的結點有限集,或為空樹(即結點個數等于0),或有一個根結點和兩顆分別稱為左子樹和右子樹的互不相交的二叉樹構成。二叉樹每個結點的度不大于2(即每個結點最多只有兩個子結點),且子樹有左右之分,不可隨意顛倒順序。
二叉樹的應用很廣泛,可基于二叉樹前中后遍歷的遍歷法則用于文件夾管理上,可用于輸出某個文件夾下的所有文件名稱、統計某個文件夾的大小等。二叉樹作為一種數據結構,也可用于數據庫系統的排序和檢索等。二叉樹中的哈夫曼樹還可用于文本壓縮編碼,哈夫曼編碼是一種最基本的壓縮編碼方法。
使用億圖圖示軟件來繪制二叉樹的操作十分簡便快捷,通過以下幾個步驟的進行就可輕松繪制出一幅專業美觀的二叉樹模型圖啦。
第一步,下載并安裝“億圖圖示”軟件桌面端,安裝完成后雙擊啟動軟件,開始作圖。也可瀏覽器輸入網址直接訪問億圖圖示在線版。
第二步,新建二叉樹模型圖。依次點擊“文件”-“新建”,在出現頁面上方的搜索欄中輸入“二叉樹”,點擊“搜索”按鈕,下方就會展開相應的模板庫。
第三步,從下方出現的模板庫中選取一個自己喜歡的模板,點擊使用,打開模板。
第四步,雙擊文本框,替換二叉樹模板內的文字。可根據自身需求增刪或移動模板內的節點個數及位置,也可根據自己的喜好個性化二叉樹模型圖。
第五步,繪制完成后,可點擊左上角的文件按鈕,對繪制好的二叉樹模型圖進行保存、另存為、導出等操作。
億圖圖示是一款跨平臺綜合辦公繪圖類的國產軟件,適用于Windows、Mac以及Linux多個系統平臺。支持繪制的繪圖類型多達260多種,且對各個繪圖類型,軟件內置了豐富的模板可供用戶挑選使用,具有豐富的繪圖素材可幫助使用者快速繪制,二叉樹模型圖、項目流程圖、思維導圖、商務圖表、組織結構圖、甘特圖、UML以及網絡拓撲圖等多種圖表類型,提高工作學習效率。
使用億圖圖示繪制二叉樹模型圖,直接搜索套用模板,可快速繪制出專業美觀的二叉樹模型圖,有效節約時間成本!
支持跨平臺使用:軟件支持Windows、Mac和Linux多個系統平臺使用,同時具有億圖在線版可支持在各個主流瀏覽器下直接輸入相應網址進行使用。
導入格式豐富:支持導入Visio,SVG文件,也可批量轉化一整個目錄的Visio文件到Edraw文件,輕松實現文件格式轉變。
導出格式豐富:可將圖表導出為JPG、PNG、GIF、HTML、PDF等多種格式,滿足不同的分享使用需求。
海量的符號資源庫:億圖軟件內置超26000種圖形模板和矢量符號,可供用戶隨心挑選使用,快速繪制出漂亮美觀的圖表。
操作簡單:軟件采用拖曳式操作,自帶模板,無需繪圖基礎,操作門檻低。
自hackernoon,作者:javinpaul,機器之心編譯,機器之心編輯部。
同學,你會手寫二叉樹嗎?近來正值秋招季節,很多編程面試都要求手寫數據結構手推機器學習算法。各位同學為了面試也會刷各種編程題,其中數據結構與排序搜索算法又是最為基礎的內容。在本文中,我們為各位讀者準備了 48 道基礎面試題,它可以幫助我們更深地理解數據結構。本文所有面試題都提供了 Java 解決方案,并介紹了比較流行的 GitHub 面試題項目。
很多計算機科學專業畢業生和程序員都會去滴滴出行、這樣的獨角獸公司,或者亞馬遜、微軟和谷歌這樣的科技巨頭申請編程和軟件開發職位。你在申請這些工作時,肯定很想知道面試官會問到哪些問題。
在本文中,作者會分享一些常見的編程面試問題,這些問題來自于針對不同經驗層次的程序員的面試——從應屆畢業生到具有一兩年經驗的程序員。
編程面試題通常包含數據結構和基于算法的問題,以及一些邏輯問題,例如:如何在不使用臨時變量的情況下交換兩個整數?
為了清晰,編程面試題需要劃分為不同主題。我們在面試中經常看到的領域是數組、鏈表、字符串、二叉樹以及有關算法的問題(例如字符串算法、快速排序或基數排序等排序算法),本文將介紹這些內容。
雖然本文無法覆蓋你在面試中將要面臨的所有問題,但是它可以給你提供足夠的思路,讓你在面試時對于各種挑戰有所準備。
一旦解決了這些問題,你就可以有信心面對任何電話面試或現場面試了。
當然,如果你對于基本數據結構和算法沒有足夠的知識儲備,那么直接接觸以下問題將對你沒有幫助。
算法和編程面試題 TOP 48
廢話少說,這里有一份「編程面試最常見的問題列表」:
1. 數組編程面試問題
數組是最基本的數據結構,它將元素儲存在連續的內存空間中。數組也是面試官最喜歡問的主題之一,在任何編程面試中都能聽到非常多關于數組的問題,例如反轉數組、排序數組或搜索數組元素等。
數組這種數據結構的主要優點在于如果給定索引,那么它會提供 O(1) 復雜度的搜索,這種搜索速度非常迅速。但是從數組中添加或移除元素會比較慢,因為一旦創建了數組,我們就很難再更改它的大小。如果需要更長或更短的數組,我們就需要重新創建新數組,并將老數組的所有元素復制到新數組中。
解決數組問題的關鍵是對數組數據結構有比較深的理解,同時還需要了解循環、遞歸和基本運算子等常見的編程結構。以下是一些常見的數組編程面試問題:
1. 在一個元素為 1 到 100 的整數數組中,如何搜索缺失元素?
2. 給定一個數組,如何搜索重復元素?
3. 給定一個亂序數組,如何搜索最大和最小元素?
4. 給定一個數值,如何搜索整數數組中加和為該數值的成對元素?
5. 如果數組包含多個重復值,如何搜索所有重復值?
6. 給定一個數組,如何用 Java 刪除重復元素?如何在不使用庫的情況下移除數組中的重復元素?
7. 如何使用快速排序算法對整數數組進行排序?
8. 如何使用 Java 反轉一個數組?
這些問題不僅能幫助我們提高解決問題的能力,同時也能提升我們關于數組數據結構的理解。
如果你需要了解更多基于數組的深度問題,你可以在 GitHub 或 Coursera 上多找找關于數據結構的課程與資料,例如在 GitHub 中,就有非常多關于數組的學習資料,下面我們介紹了一份中文版的谷歌的面試資料,它在 GitHub 上有 6 萬多的收藏量。
項目地址:https://github.com/jwasham/coding-interview-university/blob/master/translations/README-cn.md
2. 鏈表編程面試問題
鏈表是補充數組數據結構的另一種常見數據結構。與數組類似,它也是線性數據結構,以線性方式存儲元素。
然而,與數組不同的是,它不會將元素存儲在連續的位置;相反,它會將其分散存儲在內存中,彼此通過節點相互連接。鏈表是節點列表,其中每個節點包含存儲的值和下一個節點的地址。
由于這種結構,在鏈表中添加或刪除元素變得很簡單,因為你只需要改變鏈接而不是創建數組,但是這樣會使搜索變得困難,并且經常需要 O(n) 的時間復雜度才能在單個鏈表中找到某個元素。
這篇文章(https://javarevisited.blogspot.com/2013/07/difference-between-array-and-linked-list-java.html)提供了更多關于數組和鏈表數據結構之間差異的信息。
鏈表還有多種變體,如單鏈表,即允許在一個方向(正向或反向)上遍歷;雙鏈表則允許你在兩個方向(向前或向后)遍歷;最后是循環鏈表,它形成一個循環。
要解決關于鏈表的問題,掌握遞歸知識很重要,因為鏈表是遞歸數據結構。
如果你從鏈表中取出一個節點,剩下的數據結構仍然是鏈表,因此,許多鏈表問題的遞歸解比迭代解更簡單。
以下是關于鏈表的一些常見問題和解決方案:
9. 如何在一次傳遞中找到單鏈表的中間元素?
10. 如何檢查給定的鏈表是否包含循環?如何找到循環的起始節點?
11. 如何反轉鏈表?
12. 在沒有遞歸的情況下如何反轉單鏈表?
13. 如何刪除亂序鏈表中的重復節點?
14. 如何測量單鏈表的長度?
15. 如何從單鏈表的末端找出第三個節點?
16. 如何使用堆棧算出兩個鏈表的總和?
這些問題有助于你發展解決問題的技能,并提升你對鏈表數據結構的了解。目前有非常多的資源可以幫助我們理解鏈表,例如在 GitHub 上一個交互式的編碼實踐中,它使用 Jupyter Notebook 提供了數據結構與算法的各種練習,其中就包括了很多鏈表問題及實踐。
項目地址:https://github.com/donnemartin/interactive-coding-challenges
3. 字符串編碼面試問題
除了數組和鏈表數據結構,字符串也是編程工作面試中的另一熱點話題。我參加過的編碼面試基本都問過關于字符串的問題。
如果你了解數組,那么你就能輕易地解決基于字符串的問題,因為字符串就是字符數組。因此,你通過解決數組編程問題學到的所有技巧,也能用來解決字符串編程問題。
以下是編程工作面試中常問的字符串編程問題列表:
17. 如何打印字符串中重復的字符?
18. 如何檢查兩個字符串是否互為逆序?
19. 如何打印字符串中首個非重復字符?
20. 如何使用遞歸反轉給定字符串?
21. 如何檢查一個字符串是否僅包含數字?
22. 如何搜索字符串中的重復字符?
23. 給定一個字符串,如何統計元音數和輔音數?
24. 給定一個字符,如同計算它在字符串中出現的次數?
25. 如何搜索一個字符串的所有排列情況?
26. 在不使用任何庫的情況下,如何反轉給定句子中的單詞?
27. 如何檢查兩個字符串是不是互為旋轉(rotation)?
28. 給定一個字符串,如何檢查它是不是回文結構?
這些問題可以提升你對字符串數據結構的了解。如果你能獨立解決所有這些字符串問題,說明你的狀態很好。
如果想深入了解一些更復雜的問題,我推薦你去看 Steven Skiena 的《The Algorithm Design Manual》,這本書里有最難的算法問題。
網上也有該書的 PDF 版,下載地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.471.4772&rep=rep1&type=pdf
如果你需要更多的練習,這里還有另外 20 個關于字符串編程的問題:
http://javarevisited.blogspot.sg/2015/01/top-20-string-coding-interview-question-programming-interview.html
4. 二叉樹編程面試問題
現在我們只了解了線性數據結構方面的問題,但是真實世界中的所有信息不可能全是線性的,這就需要樹數據結構了。
樹數據結構允許以層級形式存儲數據。根據存儲數據的方式,有多種樹類型,如二叉樹。
和它的近親二叉查找樹一樣,它也是最流行的樹數據結構之一。因此,你會看到很多相關的有趣問題。例如,如何遍歷樹、計算節點數量、找出深度,以及檢查是否平衡。
解決二叉樹問題的關鍵在于深厚的理論知識,如二叉樹的大小或深度、什么是葉節點、什么是節點,以及了解流行的遍歷算法。
以下是軟件工程師或開發工作面試中常見的二叉樹相關編程問題:
29. 如何實現二叉查找樹?
30. 如何對給定二叉樹執行前序遍歷?
31. 如何在沒有遞歸的情況下對給定二叉樹執行前序遍歷?
32. 如何對給定二叉樹執行中序遍歷?
33. 如何在沒有遞歸的情況下通過對給定二叉樹執行中序遍歷來打印所有節點?
34. 如何實現后序遍歷算法?
35. 如何在沒有遞歸的情況下對給定二叉樹執行后序遍歷?
36. 如何打印二叉查找樹的所有葉節點?
37. 如何計算給定二叉樹中葉節點的數量?
38. 如何在給定數組中執行二元搜索?
如果你認為自己對二叉樹編程的了解不足,無法解決這些問題,我建議你先熟練掌握數據結構和算法知識,比如你可以上這門課《From 0 to 1: Data Structures & Algorithms in Java》。同樣,你也可以查閱準備 Google 面試的一套完整手冊,這套 GitHub 手冊前面已經介紹了,但它在二叉樹等數據結構上真的有非常多的案例與教程。
項目地址:https://github.com/jwasham/coding-interview-university
如果你需要更多推薦,可以參考:
5. 其它編程面試問題
除了數據結構方面的問題,大部分編程工作面試也會問關于算法、設計、位運算和通用的邏輯問題。
針對性練習很重要,因為有時在實際面試中它們會有點難解。事先練習不僅能夠讓你熟悉這些問題,還能讓你在向面試官解釋答案時更加自信。
39. 如何實現冒泡排序算法(bubble sort algorithm)?
40. 如何實現迭代快速排序算法(iterative quicksort algorithm)?
41. 如何實現插入排序算法(insertion sort algorithm)?
42. 如何實現歸并排序算法(merge sort algorithm)?
43. 如何實現桶排序算法(bucket sort algorithm)?
44. 如何實現計數排序算法(counting sort algorithm)?
45. 如何實現基數排序算法(radix sort algorithm)?
46. 如何在不使用第三個變量的前提下交換兩個數字?
47. 如何確認兩個矩形是否重疊?
48. 如何設計自動販賣機?
如果你想查看更多此類編程問題,可以閱讀這本書《Cracking the Coding Interview: 189 Programming Questions and Solutions》,適合短時間內準備編程工作面試。
下載地址:http://lib1.org/_ads/fcb49f53d5e943ce8acdc4469f63dc5d
你練習的問題越多,準備就越充分。因此,如果你認為 48 道題不夠的話,可以查看:
現在你已經準備好面試了
這部分將介紹一些數據結構和算法之外的常見問題,可以幫助你在面試中取得更好的表現。
我的博客中還有很多此類問題,詳見:http://www.java67.com/
這些常見的編程、數據結構和算法問題是你去任何一家公司面試都必須知道的,不管是大公司還是小公司,不管面試的職位高或低。
如果你正在尋找編程或軟件開發工作,那么你可以先使用這些編程問題開始準備。該列表提供了一些不錯的面試準備話題,能夠幫助你評估自己的面試準備工作是否充分。
熟練掌握數據結構和算法知識是編程工作面試成功的關鍵,你應該更多地關注這些問題。
擴展閱讀:
原文鏈接:https://hackernoon.com/50-data-structure-and-algorithms-interview-questions-for-programmers-b4b1ac61f5b0
圖是一種特殊的數據結構,由點和邊構成,它可以用來描述元素之間的網狀關系,這個網狀沒有順序,也沒有層次,就是簡單的把各個元素連接起來。
圖(graph):圖(graph)由邊(edge)的集合及頂點(vertex)的集合組成。通常記為:G=(V,E)。對于兩個圖G和G’,如果G’的頂點集合與邊集合均為G的頂點集合與邊集合的子集,那么稱G’是G的子圖。子圖實際上就是一張圖里面小一點的圖,也可以是點,不難理解。
圖常用來表示“多對多”的關系,如常說的:六度空間理論(Six Degrees Separation)
邊又稱為線(line)或弧(arc),邊(u,v)中表示u和v鄰接(adjacent),(u, v) ∈ E,
一條邊是一個頂點對(u,v),u, v ∈ V,按照圖的頂點對是否有序,頂點對有序的圖稱為有向圖(directed graph, digraph),此時邊(u,v)和(v,u)是兩條不同的邊,頂點對無序的圖稱為無向圖(undirected graph),此時邊(u,v)和(v,u)是兩條相同的邊,無向圖可看作一個特殊的有向圖
具有成分的邊包含:權(weight)、值(cost/value),此時圖由可分為有權圖(weighted graph)和無權圖(unweighted graph),無權圖可以看作是所有邊權值相同的有權圖。
路徑(path),一條路徑是一個頂點序列u1, u2, u3, …, un,(ui, u(i+1)) ∈E,1<=i<n。路徑長等于路徑的邊數:n-1,不包含邊的路徑長為0。
簡單路徑:路徑上所有頂點互異,起點和終點可以相同
環或圈(cycle),此時u1=un,而且路徑長至少為1,有向圖(u,v)和(v,u)是一個圈,無向圖(u,v)和(v,u)通常不被認為是一個圈。其中無圈圖(acyclic graph)中沒有圈,無圈有向圖又稱為DAG(directed acyclic graph)
連通圖(connected graph),無向圖中每個頂點到任意頂點都存在一條路徑,連通的有向圖稱為強連通(strongly connected),非連通的有向圖,去掉方向其基礎圖(underlying graph)是連通的,則成為弱連通的(weakly connected)
完全圖(complete graph),圖中任意一對頂點都存在一條邊
稀疏圖(sparse graph),每個頂點的度數較小的圖
圖的應用很廣泛,這里舉幾個簡單的例子。
另外圖論又可用于研究物理學和化學中的分子
本系列主要講二叉樹,關于圖,推薦閱讀文章有:
轉載本站文章《講透學爛二叉樹(一):圖的概念和定義—各種屬性特征淺析》,請注明出處:https://www.zhoulujun.cn/html/theory/algorithm/TreeGraph/8281.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。