目录
一、二叉搜索树的概念
- 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
二、二叉搜索树的模拟实现
1、定义节点
首先需要确定二叉树的节点,有左节点、和右节点以及节点的值。
2、构造二叉树
3、析构二叉树
遍历左右二叉树,删除节点并将节点置为空。
4、拷贝二叉树
拷贝二叉树,我们不能使用insert来一个一个插入,因为inset带有筛选的功能,最后结果顺序会不同的。
我们使用类似于前序遍历的方式,进行拷贝,遍历到哪就相当于拷贝到哪。
首先遇到空就返回。1.拷贝结点 2.递归拷贝左子树3.递归拷贝右子树。4.最后将拷贝结点返回。
5、二叉树赋值
6、插入节点
🌟【非递归方式】
过程:
a. 树为空,则直接新增节点,赋值给root指针
b. 树不空,按二叉搜索树性质查找插入位置,插入新节点
步骤:
a.当插入的结点值key要比根结点大,则key需要到根的右树进行比较,当key的值比根结点小,则key需要到根的左树进行比较,当key的值与根结点相同时,则返回fasle,按照这样的方式循环下去,当要比较的结点为空时,则就可以将结点插入到这个位置上了。每次比较中都要记录父节点的位置,因为最后需要链接起来。
b.最后链接起来需要和父结点比较一下才能知道链接到父节点的左边还是右边。如果大于父节点则链接到右边,如果小于父节点则连接到左边。
🌟【递归方式】
递归实现方式的思想其实是一样的,如果节点为空,就创造一个节点。如果不为空,就比较节点与需要插入值的大小,如果比节点大就插入右边,如果比节点小就插入左边,遇到空就新建一个节点。当递归结束时,就可以将开辟好结点链接起来。(递归的过程就是不断的在创建结点,回来的过程就是不断地将结点链接起来)。这里不需要像非递归那样,每次比较都需要记录父节点的位置,我们这里用一个引用就可以轻松解决问题!我们的指针参数使用引用,即子函数的参数是递归函数参数的别名。
7、打印节点
运用递归,分别打印 root 左边和右边的数值,遇到空就返回。
8、搜索节点
过程:
a.从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。如果没有找到就返回 false.
b.最多查找高度次,走到到空,还没找到,这个值不存在。