66/67/68. 二叉樹的前/中/后序遍歷 【03-09】
分別對應的lintcode地址為
二叉樹的前序遍歷
二叉樹的中序遍歷
二叉樹的后序遍歷
之前一直耽擱了好久沒刷林扣了,用js寫二叉樹代碼量還是不小,有的地方比較啰嗦,見諒~~
//構造節點
function Node(){
this.text=''
this.leftChild=null
this.rightChild=null
}
//構造節點數組
function buildNodes(arr){
var nodes=[]
arr.forEach(function(a){
var node=new Node()
node.text=a
nodes.push(node)
})
return nodes
}
//構造節點樹
function buildNodeTree(arr){
var nodes=buildNodes(arr)
var index=0,sharpNum=0 //索引,text為#的節點數
while(index<nodes.length){
if(nodes[index].text!='#'){
nodes[index].leftChild=nodes[2*index+1-sharpNum]
nodes[index].rightChild=nodes[2*index+2-sharpNum]
}else{
sharpNum+=2
}
index++
}
return nodes
}
//遍歷
var res=[]
//前序遍歷
function firstRoot(node){
res.push(node.text)
if(node.leftChild&&node.leftChild.text!='#'){
firstRoot(node.leftChild)
}
else if(node.rightChild&&node.rightChild.text!='#'){
firstRoot(node.rightChild)
}else return;
}
//中序遍歷
function middleRoot(node){
if(node.leftChild&&node.leftChild.text!='#'){
if(node.leftChild.leftChild&&node.leftChild.leftChild.text!='#'){
middleRoot(node.leftChild)
}else{res.push(node.leftChild.text)}
}
res.push(node.text)
if(node.rightChild&&node.rightChild.text!='#'){
if(node.rightChild.leftChild&&node.rightChild.leftChild.text!='#'){
middleRoot(node.rightChild)
}else{
res.push(node.rightChild.text)
}
}
return;
}
//后序遍歷
function lastRoot(node){
if(node.leftChild&&node.leftChild.text!='#'){
if(node.leftChild.leftChild&&node.leftChild.leftChild.text!='#'){
middleRoot(node.leftChild)
}else{res.push(node.leftChild.text)}
}
if(node.rightChild&&node.rightChild.text!='#'){
if(node.rightChild.leftChild&&node.rightChild.leftChild.text!='#'){
middleRoot(node.rightChild)
}else{
res.push(node.rightChild.text)
}
}
res.push(node.text)
}
//main
var nodes=buildNodeTree([1,'#',2,3])
lastRoot(nodes[0])
console.log(nodes)
console.log(res.join(',')) //最后結果