剑指offer ---- 二叉树与递归算法

二叉树的关键点之一是遍历

前序遍历
中序遍历
后序遍历
遍历的关键点是叫啥,那个节点优先读取,这是核心。二叉树每个节点都有左子树和右子树,而不同的遍历就是每个节点位置应该先读哪个?比如前序遍历那么,每个节点就是前面的先读取,然后是左边然后是右边。中序遍历的话呢,是先左边的作为优先了。后序的话就是后面两个优先。这是核心原则,把握这个就能正确读取。每个节点先判断有无左右,有的话就开始看前中后遍历了。

下面是链接关于二叉树的:
https://www.jianshu.com/p/bf73c8d50dc2
https://blog.csdn.net/qq_33243189/article/details/80222629

Python的递归实现

https://www.cnblogs.com/icekx/p/9127569.html
https://www.cnblogs.com/bjwu/p/9284534.html

剑指offer 使用前序遍历和中序遍历构建二叉树:

首先要明确的时候前序遍历和中序遍历的核心。前序遍历是先从根节点开始,这是不变的原则,也就是当我们用递归不断缩小问题的时候,前序遍历的首位都是根节点。所以每次判断第一位就可以知道当前的根节点。——————从递归的角度看

其次是要明确中序遍历的的核心是,先左子树然后根节点然后右子树,所以通过这个性质可以知道在不断缩小递归德过程中,根据前序遍历的根节点就可以知道中序遍历那些是已知根节点的左边部分那些是已知根节点的右边部分。

最后通过上面的分析,不断的进行递归的过程中。不断地将大问题缩小到相同性质的小问题,不断找到根节点,不断的判断左子树和右子树不断地缩小最后的出来结果。。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        if len(pre) == 0:
            return None
        if len(pre) == 1:
            return TreeNode(pre[0]) 
        else:
            node = TreeNode(pre[0])
            node.left = self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1],tin[:tin.index(pre[0])]) #加一的原因是让模型始终有数值输出也就是当没有左右子树的也有数值输出,也不会输出空值
            node.right = self.reConstructBinaryTree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0])+1:]) 
        return node
        # write code here

二叉查找树BTS

思路很简单,有左子树,左子树的一定比根节点小,有右子树,右子树一定比根节点大。一般来说平衡的话,那么二叉查找树比较好查找,二分法即可。但是二叉查找树会出现变成线性读取,这时候时间复杂读就变成了O(n)。所以引入了红黑树和平衡二叉树。红黑树是平衡二叉树的一种,因为平衡二叉树有着严格的规则,所以红黑树算是不太严格的规则。平衡二叉树只有旋转的操作,旋转的操作是平衡的关键,而红黑树有旋转和变色两种操作。

有了平衡二叉树干啥要红黑树?
https://zhuanlan.zhihu.com/p/72505589

总结:平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况

添加和查找

感觉这就是添加和查找本身的问题,如何更快的添加,如何更快的查找,红黑树解决了更好的添加,平衡二叉树则解决了更好的查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值