二叉树
主要是二叉树的遍历,搜索树的特性, 二叉平衡树的特性
迭代遍历的模板是当前节点指针或栈不为空时一直进行遍历
- 指针不空,指针压栈,若是前序,在此进行操作,同时继续向之前进行方向迭代下去
- 指针空,弹出栈顶元素回溯,中序此时对弹出节点进行操作。
- 后序是左右中,是逆序的中右左,本质上是前序,可以用栈或直接库函数遍历
对于二叉树仍然常用递归,递归主要考虑以下三点:
- 返回值以及(每次递归变化的)参数
确定每次递归的返回值:
也就是说,对于有返回值有两种情况
- 要搜索整棵树,也就是对于一个结点的左边和右边都有一个返回值,我们分别用left和right记录,在后续对这两个返回值还有逻辑判断或者操作。
- 只用搜索一条边,遇到符合条件的值或者路径要一路返回,这样一般就是递归函数写在return后面可以不断跳出循环。
- 确定停止递归的条件
- 抽象出每次递归要做的重复性工作(单层逻辑)
返回值这里也有说法,如果是遍历整棵树并且每次需要处理递归返回值,这里递归函数需要返回值,如果下次递归不需要返回值,这里函数就不需要返回值。同时如果每次只是找一条路或者一个点,也需要返回值,使整个递归随时结束
二叉搜索树的特性使得其中序遍历是一个递增序列,因此可以借助这个性质判断二叉搜索树,或者利用递增性质达到某种要求,但是如果是搜索一个固定大小的树,就可以用全部序遍历从根节点搜起,大了往左树搜,小了往右树搜这一性质来递归
在二叉搜索树中搜索一个值和判断一棵树为二叉搜索树的逻辑是不同的,这里由于二叉搜索树的性质不仅仅是对于单个节点它的值大于左边节点值,小于右边节点值,而是其左边子树的所有结点的值都小于该节点,右边子树所有节点的值大于该节点。
关于树的递归调用的时间复杂度
主要看这棵树在调用过程中形成的节点个数
我直接盗卡哥的图和金句,这里墙裂推荐代码随想录刷题,深入浅出入股不亏,我这里只是浅浅总结一下