摘要:從先序遍歷的結果和中序遍歷的結果還原二叉樹的結構先序遍歷結果中序遍歷結果,原樹中無重復數字考慮了一些特殊情況遞歸結束的地方根節點的值,根據先序遍歷的特點。
自己在網上看到的相關的Javascript算法,持續總結,看別人的算法總覺得很難理解。等自己想不出來的時候就會覺得容易理解了。
二叉樹相關,首先是構建二叉樹。
從先序遍歷的結果和中序遍歷的結果還原二叉樹的結構,先序遍歷結果{1,2,4,7,3,5,6,8},中序遍歷結果{4,7,2,1,5,3,8,6},原樹中無重復數字
function Node(data,left,right){ this.data = data; this.left = left; this.right = right; } function buildBinaryTree(preorder,inorder){ if(preorder.length!=inorder.length) return null;//考慮了一些特殊情況 if(preorder.length<0) return null; if(preorder.length==1) return new Node(preorder[0],null,null);//遞歸結束的地方 var data = preorder[0];//根節點的值,根據先序遍歷的特點。 var root = null; var len = preorder.length; var index; for( index=0 ; index其次是利用非遞歸算法來獲得二叉樹的遍歷結果。關鍵就是用stack來保存樹的訪問結構。通過pop,push保存訪問的順序,通過node的type來決定是繼續分解還是直接輸出結果。 function preOrder(root){ // if(!root||!root.data) return [];//只是為了區分特殊情況。 var nodeLeft = []; //儲存要遍歷的節點 nodeLeft.push(root); while(nodeLeft.length>0){ var node = nodeLeft.pop(); console.log(node.data); //先序的話,沒必要區分儲存的數據是object還是number,因為直接輸出就好了。 if(node.right&&node.right instanceof Node) nodeLeft.push(node.right); //如果有右節點,那么先存起來,因為要先分析左節點。 if(node.left&&node.left instanceof Node) nodeLeft.push(node.left); } } function inOrder(root){ if(!root||!root.data) return []; var nodeLeft = []; nodeLeft.push(root); while(nodeLeft.length>0){ var node = nodeLeft.pop(); if(typeof node =="number"){ //data type is number console.log(node); continue; } if(node.right&&node.right instanceof Node) nodeLeft.push(node.right); //我覺得對于node的檢測應該在node創建的時候完成。 nodeLeft.push(node.data); //按照遍歷順序存儲 if(node.left&&node.left instanceof Node) nodeLeft.push(node.left); } } function postOrder(root){ if(!root||!root.data) return []; var nodeLeft = []; nodeLeft.push(root); while(nodeLeft.length>0){ var node = nodeLeft.pop(); if(typeof node ==="number"){ console.log(node); continue; } nodeLeft.push(node.data); if(node.right&&node.right instanceof Node) nodeLeft.push(node.right);//I think the check for whether this is a qualified node should be done when the node is built. if(node.left&&node.left instanceof Node) nodeLeft.push(node.left); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90090.html
摘要:今天同學去面試,做了兩道面試題全部做錯了,發過來給道典型的面試題前端掘金在界中,開發人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現 選擇排序 簡介 算法實現 ... 圖例詳解那道 setTimeout 與循環閉包的經典面...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:計算數組的極值微信面試題獲取元素的最終前端掘金一題目用代碼求出頁面上一個元素的最終的,不考慮瀏覽器,不考慮元素情況。 Excuse me?這個前端面試在搞事! - 前端 - 掘金金三銀四搞事季,前端這個近年的熱門領域,搞事氣氛特別強烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個搞事 boy 轉述一下。 以下是我一個朋友的故事,真的不是我。 ... ja...
摘要:中的算法附道面試常見算法題解決方法和思路關注每日一道面試題詳解面試過程通常從最初的電話面試開始,然后是現場面試,檢查編程技能和文化契合度。值得記住的數組方法有和。一個好的解決方案是使用內置的方法。 JavaScript中的算法(附10道面試常見算法題解決方法和思路) 關注github每日一道面試題詳解 Introduction 面試過程通常從最初的電話面試開始,然后是現場面試,檢查編程...
閱讀 1781·2021-11-25 09:43
閱讀 15411·2021-09-22 15:11
閱讀 2631·2019-08-30 13:19
閱讀 2015·2019-08-30 12:54
閱讀 1821·2019-08-29 13:06
閱讀 928·2019-08-26 14:07
閱讀 1620·2019-08-26 10:47
閱讀 3036·2019-08-26 10:41