我们上一篇写了一个简易二叉树的创建。
学习二叉树的创建也是对经典的数据结构又有了一定的了解,而很多数据结构也是从二叉树演化而来的
我们在看一次这种图
而我们学习创建二叉树的主要目的还是进行遍历,查找,操作这三大点。
那我们这次就先从遍历,查找开始
首先是三种遍历逻辑
重点!递归调用时 一开始传参的node为根节点,后面则会依次传入node.left,node.right !!下面的话语根节点也可能是node.right/left
遍历逻辑(比较抽象,因为是递归调用) | |
---|---|
前序遍历 | 从根节点开始,打印当前节点,然后递归遍历左子树,然后打印当前节点,在递归遍历,直到遍历到叶子节点后返回上一层递归,在遍历右子树, |
中序遍历 | 从根节点开始,如果有左孩子,则递归调用左孩子,然后没有就返回上一层打印节点,然后遍历右节点,中序遍历最后的输出结果为正序排序。 |
后序遍历 | 从跟节点开始,首先递归遍历左节点,直到为叶子节点,然后返回上一层在递归调用右节点,直到为叶子节点为止,然后返回上一层输出当前节点。这种方法根节点为最后输出。 |
最小/大值逻辑
首先我们从二叉树的创建就能看出,小节点在左边,那我们则可以这样,如果有左节点,则用循环一直访问当前节点的左节点,知道为null,此时当前节点的值就是最小值,最大值相反即可。
方法为min/max
查找指定值逻辑
比如我们查找一个在二叉树存在的值:1,
我们则先和根节点的值比较,如果小于当前跟节点则向左遍历,大于当前跟节点则向右遍历,如果等于则返回true,
这个时候我们查找一个不存在的值通过chrome最后可以看到root.node == null的情况,此时我们加个判断return false就可以了
删除节点(这个比较麻烦)还要保证删除节点后还是二叉树的数据结构。
有几种情况
实现逻辑 | ||
---|---|---|
叶子节点 | 左右节点为空 | 这种就是直接赋值为null就行了 |
兄弟节点 | 有左边或者右边有节点 | <