❤️算法系列之二叉树的实现(包含前序中序后序遍历以及节点的查找和删除)❤️

Posted Roninaxious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️算法系列之二叉树的实现(包含前序中序后序遍历以及节点的查找和删除)❤️相关的知识,希望对你有一定的参考价值。


💌1.何谓树

💙 1.1.树的定义

树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。

💙 1.2.树的特点

(1)每个节点有零个或多个子节点;
(2) 没有父节点的节点称为根节点;
(3) 每一个非根节点有且只有一个父节点;
(4) 除了根节点外,每个子节点可以分为多个不相交的子树。

💙 1.3.树的基本术语

结点的度:结点拥有的子树的数目。
叶子节点:度为零的结点。
树的度:树中结点的最大的度。
树的层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。
树的高度:树中结点的最大层次。
无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置。
有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置。



💌2.认识二叉树

🔥 1.1.二叉树的定义

二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。

🔥 1.2.二叉树的分类

💦 1.2.1.满二叉树

除了叶子节点之外,其他所有的节点都必须包含左子节点和右子节点

💦 1.2.2.完全二叉树

对于n层的二叉树,它的n-1层的节点个数必须达到最大值。第n层包含叶子节点,并且叶子节点从左到右依次排列

💦 1.2.3.平衡二叉树

它的任意节点的左右子树的高度差的绝对值不超过1



💌3.二叉树的遍历

🔥 3.1.前序遍历

//前序遍历  根->左—>右
    public void preOrder(TreeNode temp) {
        if (temp == null) {  //递归结束条件
            return;
        }
        System.out.println(temp);
        preOrder(temp.getLeft());
        preOrder(temp.getRight());
    }

🔥 3.2.中序遍历

//中序遍历  左->根->右
    public void infixOrder(TreeNode temp) {
        if (temp == null) {
            return;
        }
        preOrder(temp.getLeft());
        System.out.println(temp);
        preOrder(temp.getRight());
    }

🔥 3.3.后序遍历


    //后序遍历   左->右->根
    public void sufOrder(TreeNode temp) {
        if (temp == null) {
            return;
        }
        preOrder(temp.getLeft());
        preOrder(temp.getRight());
        System.out.println(temp);
    }


💌4.二叉树节点的查找

以前序遍历为例
一直递归下去,如果找到了进行返回即可。然后用resultNode进行接收,直接返回

🔥 4.1.前序查找

    /**
     * 前序查找
     * @param temp 节点
     * @param no 带查询id
     * @return 查询到的
     */
    public TreeNode preSearch(TreeNode temp, int no) {

        if (temp == null) {
            return null;
        }
        if (temp.id == no) { //说明找到了,直接返回
            return temp;
        }
        TreeNode resultNode = null;
        if (temp.getLeft() != null) {
            resultNode = preSearch(temp.getLeft(), no);
        }
        if (resultNode != null) {
            return  resultNode; //如果找到,直接返回,就不用再执行下面的right
        }
        if (temp.getRight() != null) {
            resultNode = preSearch(temp.getRight(), no);
        }
        return resultNode;
    }

🔥 4.2.中序查找

    /**
     * 中序查找
     * @param cur 节点
     * @param no 带查询id
     * @return 查询到的
     */
    public TreeNode infixSearch(TreeNode cur, int no) {
        if (cur == null) {
            return null;
        }
        TreeNode resultNode = null;
        if (cur.getLeft() != null) {
            resultNode = infixSearch(cur.getLeft(), no);
        }
        if (resultNode != null) {
            return resultNode;
        }
        if (cur.id == no) {
            return cur;
        }
        if (cur.getRight() != null) {
            resultNode = infixSearch(cur.getRight(), no);
        }
        return resultNode;
    }

🔥 4.3.后序查找

/**
     * 后序查找
     * @param last 节点
     * @param no 带查询id
     * @return 查询到的
     */
    public TreeNode sufSearch(TreeNode last, int no) {
        if (last == null) {
            return null;
        }
        TreeNode resultNode = null;
        if (last.getLeft() != null) {
            resultNode = sufSearch(last.getRight(), no);
        }
        if (resultNode != null) {
            return resultNode;
        }
        if (last.getRight() != null) {
            resultNode = sufSearch(last.getRight(), no);
        }
        if (last.id == no) {
            resultNode = last;
        }
        return resultNode;
    }

💌5.二叉树节点的删除

💥删除时如果不是叶子节点需要将整个子树一块删除

这里需要注解的是结束条件,有两种情况(以左为例子)

1.一直往下递归,没有找到该节点,直接返回即可
2.head.getLeft().id == no,说明它的左子节点是需要进行删除

    /**
     * 如果是叶子节点,则将叶子节点删除即可
     * 如果不是叶子节点,则需要将相关的子树都删除
     * @param no id
     */
    public void deleteTreeNode(TreeNode head, int no) {
        if (head.getLeft() == null || head.getLeft().id == no) {
            head.setLeft(null);
            return;
        } else if (head.getRight() == null || head.getRight().id == no) {
            head.setRight(null);
            return;
        }
        deleteTreeNode(head.getLeft(), no);
        deleteTreeNode(head.getRight(), no);
    }

以上是关于❤️算法系列之二叉树的实现(包含前序中序后序遍历以及节点的查找和删除)❤️的主要内容,如果未能解决你的问题,请参考以下文章

聊聊算法 • 二叉树遍历(前序中序后序层次)

树二叉树遍历算法(深度优先广度优先遍历,前序中序后序层次)及Java实现

Luna Tech | 二叉树的前序中序后序遍历

二叉树的前序中序后序遍历-非递归-使用同一段代码实现

二叉树的前序中序后序遍历相互求法

二叉树的前序中序后序遍历迭代实现