Given a Binary Search Tree (BST) with the root node root, return the minimum difference between the values of any two different nodes in the tree.

Example :

Input: root = [4,2,6,1,3,null,null]
Output: 1
Explanation:
Note that root is a TreeNode object, not an array. The given tree [4,2,6,1,3,null,null] is represented by the following diagram: 4
/ \
2 6
/ \
1 3 while the minimum difference in this tree is 1, it occurs between node 1 and node 2, also between node 3 and node 2.

Note:

  1. The size of the BST will be between 2 and 100.
  2. The BST is always valid, each node's value is an integer, and each node's value is different.
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution(object):
def minDiffInBST(self, root):
"""
:type root: TreeNode
:rtype: int
"""
# traverse node from min to max
self.last_node = None
self.min_diff = float('inf') def dfs(node):
if not node: return
dfs(node.left)
if self.last_node:
self.min_diff = min(self.min_diff, node.val-self.last_node.val)
self.last_node = node
dfs(node.right) dfs(root)
return self.min_diff
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution(object):
def minDiffInBST(self, root):
"""
:type root: TreeNode
:rtype: int
"""
# traverse node from min to max
last_node = None
ans = float("inf")
node = root
stack = []
while node:
stack.append(node)
node = node.left
while stack:
node = stack.pop()
if last_node:
ans = min(ans, node.val-last_node.val)
last_node = node
node = node.right
while node:
stack.append(node)
node = node.left
return ans

Morris Traversal:

# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution(object):
def minDiffInBST(self, root):
"""
:type root: TreeNode
:rtype: int
"""
# traverse node from min to max
last_node = None
ans = float("inf") cur = root
while cur:
if cur.left is None:
if last_node:
ans = min(ans, cur.val-last_node.val)
last_node = cur
cur = cur.right
else:
tmp = cur.left
while tmp.right and not (tmp.right is cur):
tmp = tmp.right
if not tmp.right:
tmp.right = cur
cur = cur.left
else:
tmp.right = None
if last_node:
ans = min(ans, cur.val-last_node.val)
last_node = cur
cur = cur.right
return ans

最新文章

  1. 3.2 一般的哈尔空间Vj
  2. SBCL 从REPL 中提取lisp代码
  3. 『TCP/IP详解——卷一:协议』读书笔记——17
  4. Apache Qpid Python 1.35.0 发布
  5. Netty那点事
  6. Linux进程管理知识整理
  7. Android JNI之调用JAVA方法的返回类型签名
  8. 第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)
  9. Android开发周报:Android L默认加密用户数据
  10. firefox os 该设备呼叫移动开发
  11. [Splay模版1]
  12. struts2对于处理JSON的配置
  13. CROSS JOIN,NATURAL JOIN
  14. 求你显示pdf
  15. [AHOI2017/HNOI2017]大佬
  16. 用SoapUI 测试Web Service
  17. 无界面运行Jmeter压测脚本 --后知者
  18. sqoop快速入门
  19. 字符集(编码)转换_Windows
  20. WPF 自定义属性

热门文章

  1. xtu summer individual 1 C - Design the city
  2. 什么是Etcd?
  3. [HDU4348]To the moon(主席树)
  4. Uva10294 Arif in Dhaka (置换问题)
  5. [转]Android SDK下载和更新失败的解决方法
  6. k/3cloud表格控件块粘贴代码逻辑
  7. [NOIP2003] 提高组 洛谷P1039 侦探推理
  8. BZOJ4580: [Usaco2016 Open]248
  9. nginx 安装过程中的not found
  10. 11-Js类和对象