八月二十实现二叉树的增删查,以及Build一个树
1.4.2.4.2二叉树的建树
根据前 中 后 序, 构建一个二叉树
Q1: 如果我们只知道前序,中序,后序中的某一种,能否构建出一棵二叉树?如果能,为什么?如果不能,试着举出反例。
不行
Q2:如果我们只知道前序,中序,后序中的某两种,能否构建出一棵二叉树?如果能,为什么?如果不能,试着举出反例。
不一定:
前 中: 可以
中 后: 可以
前 后: 不行
练习:已知某二叉树的先序遍历为 ABDECFG,中序遍历为 DBEAFGC,试求它的后序遍历。
1.4.2.5二叉搜索树(二叉排序树)(二叉查找树)
首先它是个二叉树, 是一种特殊的二叉树
特殊: 元素存储大小有序
又叫二叉排序树。要求树中的结点可以按照某个规则进行比较。
左子树中所有结点的key比根结点的key小,并且左子树也是二叉搜索树。
右子树中所有结点的key比根结点的key大,并且右子树也是二叉搜索树。
1.4.2.5.1二叉搜索树的操作
查找:先取根结点,如果它等于我们要查找的数就返回;如果查找的数据比根节点小,就在左子树中递归查找;如果要查找的数据比根结点大,那么就在右子树中递归查找。
插入:如果要插入的数据比结点大,并且结点的右子树为空,就将新数据直接插到右孩子的位置;如果不为空,就再递归遍历右子树,查找插入位置。同理,如果要插入的数据比结点小,并且结点的左子树为空,就将新数据插入到左孩子的位置;如果不为空,就再递归遍历左子树,查找插入位置。
删除:分三种情况处理
a. 如果要删除结点没有孩子,那么直接将该结点删除就行了。
b. 如果要删除结点只有一个孩子,那么需要就父亲结点对应的指针,指向孩子结点。
c. 如果要删除结点有两个孩子,那么我们可以找到这个结点的右子树中最小结点 (或者
左子树中最大结点),把它替换到要删除的结点上,然后再删除掉这个最小结点。