js(递归与非递归)实现二叉树的先序遍历、中序遍历、后序遍历

示例数据

var btree = {
    value:"A",
    leftLeaf:{
        value:"B",
        leftLeaf:{
            value:"D",
            leftLeaf:null,
            rightLeaf:null
        },
        rightLeaf:{
            value:"E",
            leftLeaf:null,
            rightLeaf:null
        }
    },
    rightLeaf:{
        value:"C",
        leftLeaf:{
            value:"F",
            leftLeaf:null,
            rightLeaf:null
        },
        rightLeaf:{
            value:"G",
            leftLeaf:null,
            rightLeaf:null
        }
    }
}

先序遍历(递归):

function preorder(root){    //递归方式
    if(!root) return;
    console.log(root.value);
    preorder(root.leftLeaf);   //递归调用
    preorder(root.rightLeaf);  //递归调用
}

preorder(btree);     //ABDECFG

先序遍历(非递归):利用栈后进先出的特点来处理

function preorder(root){
    if(!root) return;
    let stack = [root];
    while(stack.length>0){
        let node = stack.pop();
        console.log(node.value);
        if(node.rightLeaf){
            stack.push(node.rightLeaf);
        }
        if(node.leftLeaf){
            stack.push(node.leftLeaf); 
        }
    }
}

preorder(btree);     //ABDECFG

中序遍历(递归):

function midorder(root){    //递归方式
    if(!root) return;
    midorder(root.leftLeaf);   //递归调用
    console.log(root.value);
    midorder(root.rightLeaf);  //递归调用
}

preorder(btree);     //DBEAFCG

中序遍历(非递归):利用栈和指针

function midorder(root){
    if(!root){
        return;
    }
    let p = root;   //将二叉树的所有左节点入栈
    while(p || stack.length){
        while(p){
            stack.push(p);
            p = p.leftLeaf;
        }
        const node = stack.pop();    //弹出最左的节点输出
        console.log(node.value);
        p = node.rigtLeaf;  //将栈顶元素的右节点当做root,重复上边的步骤
    }
}

midorder(tree);    //DBEAFCG

后序遍历(递归):

function postorder(root){    //递归方式
    if(!root) return;
    postorder(root.leftLeaf);   //递归调用
    postorder(root.rightLeaf);  //递归调用
    console.log(root.value);
}

preorder(btree);     //DEBFGCA

后序遍历(非递归):

function postorder(root){
    if(!root){return}
    const stack = [root];
    const outputStack = [];
    while(stack.length){
        const node = stack.pop();
        outpusStack.push(node);
        if(node.leftLeaf) stack.push(node.leftLeaf);
        if(node.rightLeaf) stack.push(node.rightLeaf);
    }
    while(outputStack.length){
        const outNode = pop();
        console.log(outNode.value)
    }
}

postorder(tree);   //DEBFGCA

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值