《数据结构与算法之美》学习笔记二

2024-06-15 1378阅读

前言:本篇文章介绍了一下二叉树中的基本知识点,包括二叉树的种类、二叉树的存储方式以及二叉树的深度和广度优先遍历;以及《数据结构与算法》中对于数组的讲解记录,只记录了本前端能看懂的🤓,还有很多知识点是我看不懂的,后端老师请自行探索吧。

一、二叉树

最近一直在刷《代码随想录》二叉树相关的题目,总结一下非常基本的一些知识点

(一)二叉树的种类

1、满二叉树

二叉树上只有度为0和度为2的节点,并且度为0的节点都在同一层,这样的二叉树叫做满二叉树。

就是所有的节点都满满当当的。假设二叉树的深度为k,那么满二叉树的节点数为 2^k -1

《数据结构与算法之美》学习笔记二

2、完全二叉树

完全二叉树除了最底层没有填满,其他层的节点都是满的。最后一层的节点集中在左侧。

《数据结构与算法之美》学习笔记二

3、二叉搜索树

二叉搜索树是有顺序的树。

对于二叉搜索树的所有节点,如果左子树不为空,那么左子树上所有节点值都小于节点值;如果右子树不为空,那额右子树上所有节点值都大于节点值。

《数据结构与算法之美》学习笔记二

4、平衡二叉树

它是一棵空树,或者左右子树的高度差不超过1

《数据结构与算法之美》学习笔记二

(二)二叉树的存储方式

1、使用指针的链式存储

链式存储就是用 TreeNode 这个数据类型存储,相信大家在刷力扣的时候见过很多次了。

《数据结构与算法之美》学习笔记二

3、使用数组的顺序存储

使用数组存储的顺序是按照层序遍历的顺序

《数据结构与算法之美》学习笔记二

假设节点的索引是 i,那么左节点的索引就是 i*2+1;右节点的索引就是 i*2+2。

(三)二叉树的遍历

神一样的递归三部曲:

1、确定递归的参数和返回值

2、确定递归的终止条件

3、确定递归的单层逻辑

1、深度遍历

深度遍历的前中后序中的前中后,指的是中间节点出现的顺序

(1)前序

就是中左右的顺序

① 递归

const dfs = function (node) {
    if (!node) return;
    // 访问中间节点
    console.log(node);
    dfs(node.left);
    dfs(node.right);
}

② 迭代

前序遍历的访问顺序是 中左右,先访问中节点,使用栈暂存中节点的左右子节点,由于栈是先进后出的,所以应该先加入右节点,后加入左节点

var preorderTraversal = function (root) {
    const ans = [];
    if (!root) return ans;
    const stack = [root];
    while (stack.length) {
        const item = stack.pop();
        ans.push(item.val);
        item.right && stack.push(item.right);
        item.left && stack.push(item.left);
    }
    return ans;
};
(2)中序

顺序是 左中右

① 递归

const dfs = function (node) {
    if (!node) return;
    dfs(node.left);
    // 访问中间节点
    console.log(node);
    dfs(node.right);
}

② 迭代

// 中序遍历 左中右
// 其实递归就是一个模拟的过程
// 要先加左节点就要一直 .left 到达左叶子节点
// 所以要先将路过的节点存到stack里面
// 并且要用指针指向当前节点
var inorderTraversal = function (root) {
    const stack = [];
    const res = [];
    let cur = root;
    while (stack.length || cur) {
        if (cur) {
            stack.push(cur)
            // 一直找 .left
            cur = cur.left;
        } else {
            // 出栈
            const item = stack.pop();
            res.push(item.val);
            cur = item.right;
        }
    }
    return res;
};
(3)后序

顺序是 左右中

① 递归

const dfs = function (node) {
    if (!node) return;
    dfs(node.left);
    dfs(node.right);
    // 访问中间节点
    console.log(node);
}

② 迭代

上面的前序遍历的迭代实现的是 中左右,后序遍历顺序是 左右中,那么只需要先把前序变成 中右左,然后再翻转最后得到的数组就可以了

var postorderTraversal = function (root) {
    const ans = [];
    if (!root) return ans;
    const stack = [root];
    while(stack.length){
        const cur = stack.pop();
        ans.push(cur.val);
        cur.left && stack.push(cur.left);
        cur.right && stack.push(cur.right);
    }
    return ans.reverse();
};
2、广度优先遍历

就是层序遍历,使用队列或者栈暂存

 // 使用队列保存每一层的节点
var levelOrder = function(root) {
    const ans = [];
    if(!root) return ans;
    const queue = [root];
    while(queue.length){
        const len = queue.length;
        for(let i=0;i
            const item = queue.shift();
            ans.push(item.val);
            item.left && queue.push(item.left);
            item.right && queue.push(item.right);
        }
    }
    return ans;
};
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]