目录
今日良言:心之所向,素履以往
一、二叉树
1.二叉树介绍
首先,由博主先来带兄弟们走进二叉树的世界,其实,二叉树是树形结构中的一个重要结构,据字面意思我们可以理解成有两个分支的一棵树,如下图:
上图是我们生活中的二叉树, 下图是数据结构中的二叉树结构:
根据上图,提出一个问题,对于每个结点来说,我们如何对他们进行遍历,从而拿到数据呢?接下来我们就将解决这个问题。
2.前序遍历
前序遍历二叉树,首先是打印当前根节点的数据,然后再打印当前根节点的左子节点,如果是左子树,就向下遍历打印,当左子结点打印完后,开始打印右子节点。简单记忆:根左右
看完文字解析,是不是一头雾水,接下来我们用图解来仔细分析前序遍历。
图中的蓝色箭头就是整个前序遍历,开始的结点是根节点1。首先我们需要创建结点,主要属性有如下:
接下来我们将上面的操作转换成代码,就是如下代码:
3.中序遍历
中序遍历二叉树,首先递归到左子树的叶子结点,然后开始打印,然后打印该叶子结点的根节点,然后再打印根节点的右子树。简单记忆就是:左根右
接下来还是用图解来分析一下:
然后我们将上述操作转换成中序遍历的代码如下:
4.后序遍历
后序遍历二叉树,首先,我们先向左子树递归,当递归到左子树的叶子结点时,打印这个叶子结点,打印完这个叶子结点后,开始向这个叶子结点的父节点的右子树递归打印,然后再打印这个父节点。简单记忆就是:左右根。
接下来我们继续用图解的方式分析后序遍历:
然后将后序遍历的操作转换成如下代码:
当然,当我们在结点类中实现了前中后序遍历以及删除结点的方法后,我们还需要创建一个二叉树类BinaryTree。 然后在该类去调用前中以及删除结点的方法。该类的属性主要有:
5.删除结点
我们这里规定:1.如果删除的结点是根节点就直接将二叉树置空。 2.如果删除的是叶子结点,就直接删除。 3.如果删除的是左右子树,直接将子树置空。
分析一下,删除结点的思路:
1.首先我们第一步判断该二叉树的根节点是否为要删除结点,是则删除。
2.否的话,先判断当前根节点的左子节点是不是要删除的结点,是的话就删除并结束操作。
3.左子节点不是的话就判断当前根节点的右子节点是不是要删除的结点,是的话就删除。
4.如果左右子节点都不是的话,就向左子树递归删除。
5.左子树没有删除的话,就向右子树递归删除。
当然,对于左右孩子结点和左右子树操作的前提是不能为空
相关代码如下:
我们将第一步判断跟结点是不是要删除结点的操作放到二叉树类BinaryTree中
二、效果展示
我们这里创建的二叉树如下图:
1.前序遍历
2.中序遍历
3.后续遍历
4.删除结点
这里删除的结点是 4
三、完整代码
博主将完整代码放入了github中,如下链接: