当前位置:网站首页>二叉树第一部分

二叉树第一部分

2022-06-24 09:32:00 牧..

二叉树

在这里插入图片描述

树形结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:有一个特殊的节点,称为根节点,

根节点没有前驱节点除根节点外,

其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合 Ti (1 <= i<= m) 又是一棵与树类似的子树。

每棵子树的根节点有且只有一个前驱,可以有0个或多个后继
树是递归定义的。
在这里插入图片描述
在这里插入图片描述

概念(重要)

在这里插入图片描述

知道了 概念 那么 如何 表示 树呢 ???

在这里插入图片描述

树的表示形式

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,
孩子表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的**孩子兄弟表示
在这里插入图片描述

2、二叉树

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉
树组成。
二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。

  2. 二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树

    (有序 不是 大小有序 而是 顺序)
    在这里插入图片描述

两种特殊的二叉树

概念 :

  1. 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果
    一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树
  2. 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n
    个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全
    二叉树。 要注意的是满二叉树是一种特殊的完全二叉树
    在这里插入图片描述
    在这里插入图片描述

二叉树的 性质

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看完了二叉树的性质那么接下来我们来了解一下二叉树的存储
在这里插入图片描述

3、二叉树的存储

二叉树的存储结构分为:顺序存储和类似于链表的链式存储

这里我们 主要理解 链式存储 而顺序 存储 则 会在堆中常用

二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,具体如下:

// 孩子表示法
class Node {
    
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}


// 孩子双亲表示法
class Node {
    
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}

二叉树的创建

这里 我们 创建一个二叉树 会使用 一个非常非常佬的 创建方式

不是 真正的 创建方式 ,我们先这样 创建 来理解 一下 二叉树的性质
在这里插入图片描述
在这里插入图片描述
附上代码

class BTNode {
    
    public char val;
    // 左孩子引用
    public BTNode left;
    // 右孩子
    public BTNode right;
    public BTNode (char val) {
    
        this.val = val;
    }
}
public class BinaryTree {
    
    public BTNode root; // 二叉树的根节点

    public BTNode createTree() {
    
        BTNode A = new BTNode('A');
        BTNode B = new BTNode('B');
        BTNode C = new BTNode('C');
        BTNode D = new BTNode('D');
        BTNode E = new BTNode('E');
        BTNode F = new BTNode('F');
        BTNode G = new BTNode('G');
        BTNode H = new BTNode('H');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
        E.right = H;
        return A;
    }
}

二叉树的遍历(重点)

3种遍历方式 (访问二叉树时机不同)

1.前序遍历(先根遍历

在这里插入图片描述

2.中序遍历

在这里插入图片描述

3.后续遍历

在这里插入图片描述

总结

学习完了 二叉树 的 三种遍历 方式 发现 他们 是 沿着一条路线 的,只是打印 的 时机 不同而已

练习

在这里插入图片描述

1.代码实现前序遍历

1.前序遍历 根 --》 左子树 --》 右子树

 // 通过 递归 实现前序遍历
    void preOrder(BTNode root) {
    
        if(root == null) {
    
            return;
        }
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    }

在这里插入图片描述
在这里插入图片描述
知道了 前序 遍历 那么 我们直接 来做 前序遍历 的 oj 题
在这里插入图片描述

二叉树的前序遍历

方法一 :遍历 思路

class Solution {
    
    //这里 保证 了 list 都 只有 一份 
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
    
        
        if(root == null) {
    
            return list;
        }
        list.add(root.val);
        preorderTraversal(root.left);
        preorderTraversal(root.right);  
        return list;
    }
}

方法二 : 子问题思路

class Solution {
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
         List<Integer> list = new ArrayList<>();
        if(root == null) {
    
            return list;
        }
        list.add(root.val);
        List<Integer> leftTree = preorderTraversal(root.left);
        list.addAll(leftTree);
        List<Integer> rightTree = preorderTraversal(root.right);  
        list.addAll(rightTree);

        return list;
    }
}

在这里插入图片描述
·知道前序 遍历 那么 中序遍历 和 后续遍历 那么 不就是 调整一下 递归 顺序吗

2.中序遍历 左子树 --》 根 --》 右子树

   // 中序遍历
    // 左子树 --》 根 --》 右子树
    void inOrderTraversal(BTNode root) {
    
        if(root == null) {
    
            return;
        }
        inOrderTraversal(root.left);
        System.out.print(root.val+" ");
        inOrderTraversal(root.right);
    }

二叉树的中序遍历

方法一 : 遍历思路

class Solution {
    
    List<Integer> list  = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
    
        if(root == null) {
    
            return list;
        }
        inorderTraversal(root.left);
        list.add(root.val);
        inorderTraversal(root.right);
        return list;
    }
}

方法二 : 子问题思路

class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
        List<Integer> list = new ArrayList<>();
        if(root == null) {
    
            return list;
        }
        List<Integer> leftTree = inorderTraversal(root.left);
        list.addAll(leftTree);

        list.add(root.val);

        List<Integer> rightTree = inorderTraversal(root.right);
        list.addAll(rightTree);
        return list;
    }
}

3.后序遍历 左子树 --》右子树 --》 根

    // 后序遍历
    // 右子树 --》 左子树 --》 根
    void postOrderTraversal(BTNode root) {
    
        if(root == null) {
    
            return;
        }
        inOrderTraversal(root.left);
        inOrderTraversal(root.right);
        System.out.print(root.val+" ");
    }

二叉树的后序遍历

方法一 : 遍历思想

class Solution {
    
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
    
        if(root == null) {
    
            return list;
        }
        postorderTraversal(root.left);
        postorderTraversal(root.right);
        list.add(root.val);
        return list;
    }
}

方法二 : 子问题思路

class Solution {
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
        List<Integer> list = new ArrayList();

        if(root == null) {
    
            return list;
        }
        List<Integer> leftTree = postorderTraversal(root.left);
        list.addAll(leftTree);
        List<Integer> rightTree = postorderTraversal(root.right);
        list.addAll(rightTree);

        list.add(root.val);
        return list;
    }
}

这里来 一个 idea 快捷键 整体改变 变量命 shift 加 f6

程序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从
左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是
层序遍历。
在这里插入图片描述

最后在来 4道题 结束 第一部分二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原网站

版权声明
本文为[牧..]所创,转载请带上原文链接,感谢
https://blog.csdn.net/mu_tong_/article/details/125395949