代码随想录算法训练营第13天(树1)| 二叉树理论基础篇、二叉树的递归遍历(递归法)、 、二叉树层序遍历

一、二叉树理论基础篇

题目:

视频:代码随想录

讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

一、二叉树的种类

满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树(AVL)

1、满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

2、完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。

3、二叉搜索树:前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树

左子树的值<根的值<右子树的值;对结构无要求,但是元素有序。

4、平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二、二叉树的存储方式

二叉树可以链式存储(指针),也可以顺序存储(数组)。

链式存储用的多 一个节点中有两个指针,分别指向左节点和右节点

线式存储中:如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。

三、二叉树的遍历方式

二叉树主要有两种遍历方式:

  1. 深度优先遍历:先往深走,遇到叶子节点再往回走。
  • 深度优先遍历
    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  1. 广度优先遍历:一层一层的去遍历。
  • 广度优先遍历
    • 层次遍历(迭代法)

四、二叉树的定义

//代码随想录中
public class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {
   
        
    }
    
    TreeNode(int val) {
    
        this.val = val; 
    }
    
    TreeNode(int val, TreeNode left, TreeNode right) {
   
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
//Kimi中
public class TreeNode {
   
    int val; // 数据域,存储节点的值
    TreeNode left; // 指向左子节点的引用
    TreeNode right; // 指向右子节点的引用

    // 构造函数
    public TreeNode(int val) {
   
        this.val = val; // 初始化节点的值
        this.left = null; // 左子节点初始为空
        this.right = null; // 右子节点初始为空
    }

    // 可选:提供一个全参构造函数
    public TreeNode(int val, TreeNode left, TreeNode right) {
   
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
  • 提供了两种构造函数:
    • 无参构造函数:只初始化节点的值,左子节点和右子节点默认为 null。
    • 全参构造函数:允许在创建节点时直接指定其值和左右子节点。

如何使用这个 TreeNode 类来构建一个简单的二叉树:

public class BinaryTreeDemo {
   
    public static void main(String[] args) {
   
        // 创建节点
        TreeNode root = new TreeNode(1); // 根节点
        root.left = new TreeNode(2); // 左子节点
        root.right = new TreeNode(3); // 右子节点
        root.left.left = new TreeNode(4); // 左子节点的左子节点
        root.left.right = new TreeNode(5); // 左子节点的右子节点

        // 打印树的结构(这里仅简单展示,实际可实现遍历算法)
        System.out.println("Root: " + root.val);
        System.out.

你可能感兴趣的:(代码随想录,算法)