JS二叉樹非遞歸遍歷

二叉樹的遞歸遍歷很簡單就能夠實現,二叉樹非遞歸遍歷卻想不出來?那你能夠看看下面的例子。node

一個二叉樹的例子

var root = {
val: 1,
left: {算法

val: 2,
left: {
  val: 4,
},
right:{
  val:5
}

},
right: {code

val: 3,
left: {
  val: 6
},
right: {
  val: 7
}

}
}
先實現三種遍歷的遞歸算法以做比較。遞歸

先序遍歷遞歸算法

function DLR(root){io

if(root!=null){
    console.log(root.val);
    DLR(root.left);
    DLR(root.right);
}

}
DLR(root)//1,2,4,5,3,6,7console

中序遍歷遞歸算法

function LDR(root){function

if(root!=null){
    LDR(root.left);//先遍歷到最左邊的節點,而後輸出
    console.log(root.val);
    LDR(root.right);
}

}
LDR(root)//4,2,5,1,6,3,7二叉樹

後序遍歷

function LRD(root){遍歷

if(node!=null){
    LRD(root.left);
    LRD(root.right);
    console.log(root.val);
}

}
LRD(root)//4,5,2,6,7,3,1while


看完上面的遞歸遍歷,下面對比一下非遞歸的二叉樹遍歷。你會發現遞歸真心簡單。

非遞歸前序遍歷

function DLR(root){

var arr=[],res=[];
if(root!=null){
    arr.push(root);
}
while(arr.length!=0){
    var temp=arr.pop();
    res.push(temp.val);
    //這裏先放右邊再放左邊是由於取出來的順序相反
    if(temp.right!=null){
        arr.push(temp.right);
    }
    if(temp.left!=null){
        arr.push(temp.left);
    }
}
return res;

}

DLR(root)//1,2,4,5,3,6,7

非遞歸中序遍歷

//先把左邊的,所有放進arr再輸出,處理右邊的。
function LDR(root){

var arr=[],res=[];
while(true){
    while(root!=null){
        arr.push(root);
        root=root.left;
    }
    //終止條件:最後樹遍歷完了天然就結束
    if(arr.length==0){
        break;
    }
    var temp=arr.pop();
    res.push(temp.val);
    root=temp.right;
}
return res;

}
LDR(root)//4,2,5,1,6,3,7

後序遍歷

function LRD(root){

var arr=[],res=[];
arr.push(root);
while(arr.length!=0){
    var p=arr.pop();
    res.push(p.val);
    if(p.left!=null){
        arr.push(p.left);
    }
    if(p.right!=null){
        arr.push(p.right);
    }
}
return res.reverse();

}LRD(root)//4,5,2,6,7,3,1

相關文章
相關標籤/搜索