八月二十实现二叉树的增删查,以及Build一个树

1.4.2.4.2二叉树的建树

根据前 中 后 序, 构建一个二叉树

Q1: 如果我们只知道前序,中序,后序中的某一种,能否构建出一棵二叉树?如果能,为什么?如果不能,试着举出反例。
不行

Q2:如果我们只知道前序,中序,后序中的某两种,能否构建出一棵二叉树?如果能,为什么?如果不能,试着举出反例。
不一定:

前 中: 可以
中 后: 可以
前 后: 不行

八月二十实现二叉树的增删查,以及Build一个树
八月二十实现二叉树的增删查,以及Build一个树
八月二十实现二叉树的增删查,以及Build一个树

练习:已知某二叉树的先序遍历为 ABDECFG,中序遍历为 DBEAFGC,试求它的后序遍历。

1.4.2.5二叉搜索树(二叉排序树)(二叉查找树)

首先它是个二叉树, 是一种特殊的二叉树
特殊: 元素存储大小有序

又叫二叉排序树。要求树中的结点可以按照某个规则进行比较。

左子树中所有结点的key比根结点的key小,并且左子树也是二叉搜索树。
右子树中所有结点的key比根结点的key大,并且右子树也是二叉搜索树。

1.4.2.5.1二叉搜索树的操作

查找:先取根结点,如果它等于我们要查找的数就返回;如果查找的数据比根节点小,就在左子树中递归查找;如果要查找的数据比根结点大,那么就在右子树中递归查找。

插入:如果要插入的数据比结点大,并且结点的右子树为空,就将新数据直接插到右孩子的位置;如果不为空,就再递归遍历右子树,查找插入位置。同理,如果要插入的数据比结点小,并且结点的左子树为空,就将新数据插入到左孩子的位置;如果不为空,就再递归遍历左子树,查找插入位置。

删除:分三种情况处理
a. 如果要删除结点没有孩子,那么直接将该结点删除就行了。
b. 如果要删除结点只有一个孩子,那么需要就父亲结点对应的指针,指向孩子结点。
c. 如果要删除结点有两个孩子,那么我们可以找到这个结点的右子树中最小结点 (或者
左子树中最大结点),把它替换到要删除的结点上,然后再删除掉这个最小结点。

1.4.2.5.1.1删除二叉搜索树上节点

八月二十实现二叉树的增删查,以及Build一个树

1.4.2.5.1.2栈实现先序遍历

八月二十实现二叉树的增删查,以及Build一个树

1.4.2.5.1.3栈实现后序遍历

八月二十实现二叉树的增删查,以及Build一个树

1.4.2.5.1.4栈实现中序遍历

八月二十实现二叉树的增删查,以及Build一个树

1.4.2.5.1.5使用队列实现层级遍历

八月二十实现二叉树的增删查,以及Build一个树

1.4.2.5.1.6建树操作: 根据先序和中序

八月二十实现二叉树的增删查,以及Build一个树