實戰LeetCode - 前端面試必備二叉樹算法

2021-03-02 React中文社區
本文概要1. 二叉樹簡介

二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義本身就是遞歸定義,因此採用遞歸的方法去實現樹的三種遍歷不僅容易理解而且代碼很簡潔,而對於廣度遍歷來說,需要其他數據結構的支撐,比如堆了。所以,對於一段代碼來說,可讀性有時候要比代碼本身的效率要重要的多。

2. 基礎二叉樹的構建

直接上代碼:

function Node(data, left, right) {
this.data = data;
this.left = left;
this.right = right;
}
Node.prototype.show = function () {
return this.data;
}

function BST() {
this.root = null;
}
BST.prototype.insert = function (data) {
var node = new Node(data, null, null);
if (this.root == null) {
this.root = node;
} else {
var current = this.root;
var parent;
while (true) {
parent = current;
if (data < current.data) {
current = current.left;
if (current == null) {
parent.left = node;
break;
}
} else {
current = current.right;
if (current == null) {
parent.right = node;
break;
}
}
}
}
}

var bst = new BST();
var nums = [10, 3, 18, 2, 4, 13, 21, 9, 8, 9];
for (var i = 0; i < nums.length; i++) {
bst.insert(nums[i]);
}

3.二叉樹前序遍歷

首先遍歷根節點,然後遍歷左子樹,最後遍歷右子樹

BST.prototype.perOrder = function (node) {
if (node) {
console.log(node.show() + " ");
this.perOrder(node.left);
this.perOrder(node.right);
}
}
bst.perOrder(bst.root);

4. 二叉樹中序遍歷

首先訪問左子樹,然後訪問根節點,字後訪問右子樹

BST.prototype.inOrder = function(node){
if(node){
this.inOrder(node.left);
console.log(node.show() + " ");
this.inOrder(node.right);
}
}
bst.inOrder(bst.root);

5. 二叉樹後序遍歷


BST.prototype.postOrder = function(node){
if(node){
this.postOrder(node.left);
this.postOrder(node.right);
console.log(node.show() + " ");
}
}
bst.postOrder(bst.root);

6. 查找二叉樹最小值

var minNode = function (node) {
if (node) {
while (node.left !== null) {
return minNode(node.left);
}
return node.data;
}
return null;
}

BST.prototype.findMin = function (root) {
return minNode(root)
}
bst.findMin(bst.root)

7. 查找二叉樹最大值

var maxNode = function (node) {
if (node) {
while (node.right !== null) {
return maxNode(node.right);
}
return node.key;
}
return null;
}
BST.prototype.findMax = function (root) {
return maxNode(root)
}
bst.findMax(bst.root)

8. 刪除二叉樹最小值

BST.prototype.delMinNode = function (root) {
if (!root) {
return false;
}
var current = root;
if (current.left == null) {
var rightNode = current.right;
return rightNode;
}
current.left = this.delMinNode(current.left);
return current;
}
bst.delMinNode(bst.root)

9. 刪除二叉樹最大值

BST.prototype.delMaxNode = function (root) {
if (!root) {
return false;
}
var current = root;
if (current.right == null) {
var leftNode = current.left;
return leftNode;
}
current.right = this.delMaxNode(current.right)
return current;
}
bst.delMaxNode(bst.root)

10. 判斷二叉樹是否存在某值

var searchNode = function (key, node) {
if (node == null) {
return false;
}
if (node.data > key) {
return searchNode(key, node.left);
} else if (node.data < key) {
return searchNode(key, node.right);
} else {
return true;
}
}
BST.prototype.search = function (key, root) {
return searchNode(key, root);
}
bst.search(3, bst.root)

11. 求二叉樹節點個數

BST.prototype.sizeOfTree = function (root) {
if (!root) {
return 0
}
return 1 + this.sizeOfTree(root.left) + this.sizeOfTree(root.right);
}
bst.sizeOfTree(bst.root)

12. 求二叉樹層級

BST.prototype.heightOfTree = function (root) {
if (!root) {
return 0
}
return Math.max(this.heightOfTree(root.left), this.heightOfTree(root.right)) + 1
}
bst.heightOfTree(bst.root)

13. 求二叉樹第K層的節點個數

BST.prototype.NumOfKthLevel = function (root, k) {
if (k < 0) {
return 0
}
if (root === null) {
return 0
}
if (root !== null && k === 1) {
return 1
}
return this.NumOfKthLevel(root.left, k - 1) + this.NumOfKthLevel(root.right, k - 1)
}
bst.NumOfKthLevel(bst.root,3)

14. 求二叉樹是否相同

BST.prototype.compareStruct = function (root1, root2) {
if (root1 === null && root2 === null) {
return true
}
if ((root1 !== null && root2 === null) || (root1 === null && root2 !== null)) {
return false
}
return (this.compareStruct(root1.left, root2.left) && this.compareStruct(root1.right, root2.right))
}
bst.compareStruct(bst.root, bst.root)


覺得本文對你有幫助?請分享給更多人

關注「React中文社區」加星標,每天進步

相關焦點

  • 推薦一位實力超強的平安前端算法大佬:瓶子君
    緩存機制,點亮前端技能 X 點前端進階算法4:鍊表原來如此簡單(+leetcode刷題)介紹常用的鍊表(單鍊表、雙鍊表以及循環鍊表),畫圖且代碼實現常見的鍊表操作及複雜度問題,並總結出了一套常見的鍊表答題五步驟前端進階算法5:全方位解讀前端用到的棧結構(+leetcode
  • ​LeetCode刷題實戰124:二叉樹中的最大路徑和
    算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試。
  • 【算法總結】五道常見的算法-二叉樹
    前言前段時間,寫了面試必備的一系列文章,反應還不錯。有一些讀者反饋說,能不能整理一些面試常見的算法。前段時間,我恰好總結了 LeetCode 常見的面試算法題目。https://github.com/gdutxiaoxu/Android_interview剛開始準備刷算法題目的時候,感覺真的是好難,十道題目有九道是不會的。
  • 每天學一道leetcode:103. 二叉樹的鋸齒形層次遍歷
    前言歡迎閱讀小王同學的長篇連載文章之《每天學一道leetcode》。如果您從前做過這道題目,可以從小王同學的文章裡增強對該題目的記憶和印象,思考一下小王同學給出的思路和解法有沒有優化的空間。如果您從前沒有做過這道題,不妨跟小王同學一起學習一下解題思路,以後面試的時候也許會有妙用。如果您對網際網路技術、算法知識、程式設計師個人發展感興趣,歡迎關注小王同學,小王同學將會在該領域持續更新。與此同時,如果您有任何建議或者想法,歡迎留言給小王。
  • 有關樹遍歷的javascript實現【前端-總結-leetcode算法題】
    在這裡插入圖片描述前言二月的第一天,總結一下近段時間刷的有關樹遍歷的leetcode算法題,希望寫完這篇文章的我和看完文章的你都有些收穫吧。全篇主要講的是有關樹的遍歷,使用前端javascript語言實現。當然有關樹的操作還有很多需要的深入理解和總結的。今天就暫時先把樹遍歷理解全吧。
  • 【面試錦囊】14種模式搞定面試算法編程題(1-7)
    為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小夥伴可以訂閱後臺回復"面試"加入好了不廢話啦,今天文章的主題就是分享14種解決面試算法編程題的思路(來自educative[1]),經過本人之前筆試面試經驗證明確實確實非常非常高頻,一定要十分熟悉。
  • ​LeetCode刷題實戰98:驗證二叉搜索樹
    算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試
  • 14種模式搞定面試算法編程題(PART I)
    為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小夥伴可以訂閱後臺回復"面試"加入好了不廢話啦,今天文章的主題就是分享14種解決面試算法編程題的思路(來自educative[1]),經過本人之前筆試面試經驗證明確實確實非常非常高頻,一定要十分熟悉。
  • 帶你狂刷算法Leetcode題!短時間內快速獲得實戰能力!
    如果算法理論掌握的不熟練,拿到題目沒有思路,不知道怎麼解,說明不是刷題出了錯,而是你的理論功底不紮實。只有在刷題時,不斷補充理論知識點,將理論+算法題相結合,才是最高效的刷題方式,不僅能夠反覆鍛鍊所學知識,還能立馬將理論運用於實戰,加深理解。
  • 推薦4個基於 Java語言的開源 Leetcode 題解!算法面試不愁了!
    2、☞ 《Java面試手冊》.PDF    點擊查看一個很明顯的現象,現在大廠的應屆生面試,甚至是社招面試都開始越來越重視算法了。經常會有人問 Guide 如何準備算法面試,今天統一回答一下。為了能夠更好地準備算法面試,我們大部分人能做的就是刷 Leetcode 來積累解決算法題的經驗和套路。為了能夠幫助我們更好的刷 Leetcode,Guide 精選了一些不錯的基於 Java 題解的開源項目,文末有項目連結。
  • 二叉樹算法,你懂嗎?
    聊聊面試點:一、樹 & 二叉樹樹的組成為節點和邊,節點用來儲存元素。節點組成為根節點、父節點和子節點。如圖:樹深 length 為 4;根節點的值為 5 ;父子節點關係:值為 8 和 值為 3 的節點
  • 算法工程師面試問題及資料超詳細合集(多家公司算法崗面經/代碼實戰/網課/競賽等)
    阿里巴巴計算機視覺算法實習生視頻面試 website面試經驗AI算法工程師(面試官角度) website從零基礎到BAT算法崗SP——秋招準備攻略 website螞蟻金服/曠視/虹軟/騰訊優圖暑期實習offer面經 website我在美團的這兩年(附校招筆試/面試/面經分享) website1000 面試題,BAT
  • 每日一道 LeetCode (21):對稱二叉樹
    ❝每天 3 分鐘,走上算法的逆襲之路。前文合集代碼倉庫GitHub:https://github.com/meteor1993/LeetCodeGitee:https://gitee.com/inwsy/LeetCode題目:對稱二叉樹題目來源:https://leetcode-cn.com
  • leetcode 每日一題:103.二叉樹的鋸齒形層序遍歷
    一起刷題吧一、題目分析 輸入:二叉樹輸出:二叉樹的層次遍歷,但是鋸齒型(Z之型的層次遍歷)輸出難度:中等標籤:樹,dfs/bfs示例 1:給定二叉樹 [3,9,20我們先來看下基礎版本,即二叉樹的層次遍歷,對應題目連結:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/通過 DFS 或者 BFS 都可以解決這個題目。
  • leetcode 刷500道題,筆試/面試穩嗎?
    、應付筆試或者應付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。
  • ​LeetCode刷題實戰108:將有序數組轉換為二叉搜索樹
    算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試
  • 【原創教程】數據結構與算法(1)——二叉樹
    一、二叉樹二叉樹是一種更為典型的樹樹狀結構。
  • 看看高薪,算法工程師面試,讓你懷疑人生
    一道算法題,leetcode上的,旋轉數組,leetcode 59. Spiral Matrix II。轉正二面,也是問了問滴滴的實習,問了下gbdt的原理,xgboost與gbdt的區別,gbdt用於分類時,分類概率的梯度體現在哪裡。一道編程題,矩陣A與矩陣B相乘得到矩陣C,給定A和B,求C的秩。轉正三面,三面面試官是一個研究員,對數學推導有獨特的興趣。
  • leetcode 刷500道題,筆試/面試穩嗎?別以為你自己穩了
    來源公眾號:苦逼的碼農作者:帥地想要學習算法、應付筆試或者應付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?
  • 數據結構與算法-2
    >定義:貪心算法又被稱為貪婪算法。貪心算法對每個子問題的解決方案都做出選擇,不能進行回退。動態規劃會保存以前的運算結果,並根據以前結果對當前進行選擇,有回退功能。面試題1、買賣股票的最佳時機思路:深度遍歷優先,每天是買還是賣。O(2^n)貪心算法,每天都進行買賣(假設無手續費),把利益拿到手裡。