摘要:從先序遍歷的結(jié)果和中序遍歷的結(jié)果還原二叉樹的結(jié)構(gòu)先序遍歷結(jié)果中序遍歷結(jié)果,原樹中無重復(fù)數(shù)字考慮了一些特殊情況遞歸結(jié)束的地方根節(jié)點(diǎn)的值,根據(jù)先序遍歷的特點(diǎn)。
自己在網(wǎng)上看到的相關(guān)的Javascript算法,持續(xù)總結(jié),看別人的算法總覺得很難理解。等自己想不出來的時(shí)候就會(huì)覺得容易理解了。
二叉樹相關(guān),首先是構(gòu)建二叉樹。
從先序遍歷的結(jié)果和中序遍歷的結(jié)果還原二叉樹的結(jié)構(gòu),先序遍歷結(jié)果{1,2,4,7,3,5,6,8},中序遍歷結(jié)果{4,7,2,1,5,3,8,6},原樹中無重復(fù)數(shù)字
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);//遞歸結(jié)束的地方 var data = preorder[0];//根節(jié)點(diǎn)的值,根據(jù)先序遍歷的特點(diǎn)。 var root = null; var len = preorder.length; var index; for( index=0 ; index其次是利用非遞歸算法來獲得二叉樹的遍歷結(jié)果。關(guān)鍵就是用stack來保存樹的訪問結(jié)構(gòu)。通過pop,push保存訪問的順序,通過node的type來決定是繼續(xù)分解還是直接輸出結(jié)果。 function preOrder(root){ // if(!root||!root.data) return [];//只是為了區(qū)分特殊情況。 var nodeLeft = []; //儲(chǔ)存要遍歷的節(jié)點(diǎn) nodeLeft.push(root); while(nodeLeft.length>0){ var node = nodeLeft.pop(); console.log(node.data); //先序的話,沒必要區(qū)分儲(chǔ)存的數(shù)據(jù)是object還是number,因?yàn)橹苯虞敵鼍秃昧恕? if(node.right&&node.right instanceof Node) nodeLeft.push(node.right); //如果有右節(jié)點(diǎn),那么先存起來,因?yàn)橐确治鲎蠊?jié)點(diǎn)。 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); //我覺得對(duì)于node的檢測(cè)應(yīng)該在node創(chuàng)建的時(shí)候完成。 nodeLeft.push(node.data); //按照遍歷順序存儲(chǔ) 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); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90090.html
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實(shí)現(xiàn) 選擇排序 簡介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...
摘要:計(jì)算數(shù)組的極值微信面試題獲取元素的最終前端掘金一題目用代碼求出頁面上一個(gè)元素的最終的,不考慮瀏覽器,不考慮元素情況。 Excuse me?這個(gè)前端面試在搞事! - 前端 - 掘金金三銀四搞事季,前端這個(gè)近年的熱門領(lǐng)域,搞事氣氛特別強(qiáng)烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個(gè)搞事 boy 轉(zhuǎn)述一下。 以下是我一個(gè)朋友的故事,真的不是我。 ... ja...
摘要:中的算法附道面試常見算法題解決方法和思路關(guān)注每日一道面試題詳解面試過程通常從最初的電話面試開始,然后是現(xiàn)場(chǎng)面試,檢查編程技能和文化契合度。值得記住的數(shù)組方法有和。一個(gè)好的解決方案是使用內(nèi)置的方法。 JavaScript中的算法(附10道面試常見算法題解決方法和思路) 關(guān)注github每日一道面試題詳解 Introduction 面試過程通常從最初的電話面試開始,然后是現(xiàn)場(chǎng)面試,檢查編程...
閱讀 1787·2021-11-25 09:43
閱讀 15421·2021-09-22 15:11
閱讀 2632·2019-08-30 13:19
閱讀 2015·2019-08-30 12:54
閱讀 1821·2019-08-29 13:06
閱讀 930·2019-08-26 14:07
閱讀 1621·2019-08-26 10:47
閱讀 3037·2019-08-26 10:41