程序员的数学之二进制
吴军先生在数学之美当中 也介绍了二进制
原始时代 用路边的小石子计数。
后来罗马人发明了罗马数字
公元三世纪左右,印度的数学家发明了阿拉伯数字 可以从0-9
二进制 就是2的n次方的形式。
计算机为什么使用二进制 因为 组成计算机系统的逻辑电路只有两个状态 即开关的接通与断开。
系统在受到一定程度的干扰时,仍然能够可靠地分辨出数字是”0”还是”1”。
在具体的系统实现当中,二进制数据表达具有抗干扰能力强、可靠性高的优点。
二进制也非常适合逻辑运算。
位运算
左移 其实就是将数字翻倍
右移 其实就是将数字除以2并求整数商
java当中的左移 是 <<
逻辑右移 是 >>> >>是算术右移
ds之树
数据结构的树
题目
给予一个二叉树的根节点,验证该树是否是二叉树搜索树,在O(n)时间内。
分析与解答
二叉搜索树是一种特殊的二叉树
它满足如下的条件:
- 结点的左子树所有结点的值都小于等于该结点的值。
- 结点的右子树所有结点的值都大于该结点的值。
- 结点的左右子树同样都必须是二叉搜索树。
也就是说
- 任何一个节点的key值都比它左子树上的节点的key值要大,但是比它右子树上的key值要小。
- 节点查找、插入、删除等操作的时间复杂度都是O(logn)
主要的一个特点 就是中序遍历一棵树 会得到一个递增的序列
在此题目的条件是給出一个根节点
简化起见 考虑简单的情况
即是給出的二叉树形式为列表的形式 顺序为前序 也就是一个元素就是根节点
比如
[5,1,4,#,#,3,6] 这个是給出的二叉树 根节点为第一个元素 也就是5
注意一下 实际上在 python 当中給出的应该是这样的列表
[5, 1, 4, None, None, 3, 6]
1 | def traverse_binary_tree(node, callback): |
解法
1 | class Solution1(object): |
另外也可以依次比较左右子树各个子节点的值 保证 左 < zhong < 右
1 | class Solution2(object): |
工程化的项目当中 一般是测试先行 也就是说需要先把测试用例这些东西准备好
在此 为了完善起见 肯定是需要补上测试用例的
能跑过测试 说明代码是正确的
1 | class Node(object): |
首先可以运行tests.py 文件 里面暂时只放了6个测试用例 可以看到是通过的
本次 运行环境为 python3.5
当然工程环境下可能有上百个以上的测试用例