数据结构排序算法时间复杂度和二叉树遍历算法

1、排序算法时间复杂度 

最好

最差

平均

直接插入排序

O(n)

O(n2)

O(n2)

折半插入排序

O(nlog2n)

O(n2)

O(n2)

希尔排序

O(nlog2n)

冒泡排序

O(n)

O(n2)

O(n2)

快速排序

O(nlog2n)

O(n2)

O(nlog2n)

简单选择排序

O(n2)

堆排序

O(nlog2n)

归并排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

2、二叉树前序、中序、后序、层次比那里算法

中序遍历(递归实现) 

let inOrderTraversal = function(root,arr=[]){

    if(root){

        inOrderTraversal(root.left,arr);

        arr.push(root.val);

        inOrderTraversal(root.right,arr);

    }

    return arr;

}

前序遍历(递归实现) 

let preOrderTraversal = function(root,arr=[]) {

    if(root){

        arr.push(root.val);

        preOrderTraversal(root.left,arr);

        preOrderTraversal(root.right,arr);

    }

    return arr

};

后序遍历(递归实现) 

let postOrderTraversal = function(root,arr=[]) {

    if(root){

        postOrderTraversal(root.left,arr);

        postOrderTraversal(root.right,arr);

        arr.push(root.val);

    }

    return arr

}

 层次遍历(队列方式实现)

var levelOrder = function(root) {

    let result = []

    if (!root) return result

    let queue = [root]

    let res = []

    let items = []

    while (queue.length != 0 || items.length != 0) {

        if (!queue.length) {

            queue = items

            result.push(res)

            items = []

            res = []

        }

        let nowRoot = queue.shift()

        if (nowRoot) {

            res.push(nowRoot.val);

            items.push(nowRoot.left)

            items.push(nowRoot.right)

        }

    }

    return result

};

思路解析

●同样result用来承接最后结果,queue承接当前层的全部节点,作为队列去使用,res去承接当前层queue中取出的节点的val值,items用来承接下一层的全部节点

●判断root是都为空,和上面一样就不详细解析

●进入循环,只有当当前层的节点遍历完毕并且没有下一层节点的情况下才会跳出循环

●当前层节点没有全部取出(queue的长度不为0),则取出queue中的第一个节点,节点不为null的话将当前节点的val值push如res,并获取其左右节点push入items

●当queue全部取出,说明当前层的节点已经全部遍历完毕,每个节点的val在res数组中,每个节点的左右节点在items中。我们将items赋值给queue来遍历下一层的全部节点,将res整个数组push入result结果集中,并重置items与res。

●当前层遍历完毕并且当前层全部节点都没有子节点,说明全部节点遍历完毕,跳出循环返回结果集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值