常见面试题的解法之二叉树(广度优先,序列化)

  1. 二叉树广度优先遍历,打印时连同行号一起打印;这里写图片描述

解题思路:
1.初始化时,last=1,把1放入队列;

2.将1出队,把1的子孩子2,3放入队列,更新nlast=3;

3.nlast更新完之后,打印上一次出队的1,并和last比较,如果相同就打印换行,并更新last=nlast=3;

4.将2出队,把2的子孩子4放入队列,更新nlast=4;

5,nlast更新完以后,打印上一次出队的2,并和last(3)比较,不相同,continue;

6.将3出队,将3的子孩子5,6放入队列,更新nlast=6;

7.nlast更新完以后,打印上一次出队的3,并和last(3)比较, 相同就打印换行,并更新last=nlast=6;

…………

总结就是如下循环:(初始化last=根节点)

1.将A出队,并将A的子孩子入队,更新nlast=A最后入队的子孩子;

2.打印上次出队的家伙A,并和last比较, 如果相同就打印换行,并更新last=nlast,如果 不相同,则continue

接下来我们来代码实现:
首先我们构造二叉树:

var tree = {
    value:'1',
    left:{
        value:'2',
        left:{
            value:'4',
            left:null,
            right:null,

        },

    },
    right:{
        value:'3',
        left: {
            value:'5',
            left:{
                value:'7',
                left:null,
                right:null,
            },

            right:{
                value:'8',
                left:null,
                right:null
            }
        },
        right:{
            value:'6',
            left:null,
            right:null
        }
    }
}

下面是函数:

var wid =  function(tree){
    if(!tree){
        console.log('no tree here');
    }

    var que = [];

    var nlast = 0;
    var last = tree.value;
    que.push(tree);
    while(que!=null){
        var node = que.shift();
        console.log(node.value);
        if(node.left!=null){
            que.push(node.left);
            nlast = node.left.value;
        }
        if(node.right!=null){
            que.push(node.right);
            nlast = node.right.value;
        }
        if(node.value==last){
            console.log('\n');
            last=nlast;
        }
    }
}

wid(tree);

先序遍历序列化
这里写图片描述

var pre = function(tree){
    if(!tree){
        console.log('no tree here');
    }
    console.log(tree.value);
    console.log('!')
    if(tree.left!=null){
        pre(tree.left)
    }else{
        console.log("#!");
    }
    if(tree.right!=null){
        pre(tree.right);
    }else{
        console.log('#!');
    }
}


pre(tree);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值