二叉树

88 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

二分搜索树

二分搜索树

树结构

image-20221002170757889

image-20221002170946069

树的特点就是方便高效,

  • 将数据使用树结构存储给 ,出奇的高效

二叉树

  • 和链表一样动态的数据结构
  • 每个节点最多只能有两个分支
function TreeNode(){
    this.val = null;
    this.left = null;
    this.right = null;
}

image-20221002181321748

  • 二叉树每个节点最多有两个孩子

  • 二叉树每个节点最多有一个父亲

  • 二叉树具有天然的递归结构

    • 每一个节点的左子树也是二叉树
    • 每一个节点的右子树也是一个二叉树

二叉树的递归遍历

前序遍历

var preorderTraversal = function(root) {
 let res=[];
 const dfs=function(root){
     if(root===null)return ;
     //先序遍历所以从父节点开始
     res.push(root.val);
     //递归左子树
     dfs(root.left);
     //递归右子树
     dfs(root.right);
 }
 //只使用一个参数 使用闭包进行存储结果
 dfs(root);
 return res;
};
​

中序遍历

var inorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null){
            return ;
        }
        dfs(root.left);
        res.push(root.val);
        dfs(root.right);
    }
    dfs(root);
    return res;
};

后序遍历

var postorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null){
            return ;
        }
        dfs(root.left);
        dfs(root.right);
        res.push(root.val);
    }
    dfs(root);
    return res;
};

三种遍历都只是有小部分不同

树的遍历很容易找到递归的基本结果,和每一个小的单元,看起来还是很容易的

二叉树的层序遍历

层序遍历就是一层一层的将树中的元素输出出来

对于层序遍历需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

102二叉树的层序遍历

代码实现

image-20221003112641935

[代码随想录]  www.programmercarl.com 

逻辑也不是很复杂,同时还有很多相关的拓展算法题,可以巩固层序遍历的知识。

相关算法

反转二叉树

image-20221003145449256

使用了递归和前序遍历的方法,一个节点一个节点的去反转树。实现功能

算法待补充......

二分搜索树

  • 二分搜索树也是二叉树

  • 二分搜索树的每个节点的值:

    • 大于其左子树的所有节点的值
    • 小于其右子树的所有节点的值

image-20221002182759632

image-20221002183006033

  • 存储的元素具有可比较性