LeetCode Python实现 二叉树简单部分
'''
1
二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ \9  20/  \15   7返回它的最大深度 3 。
'''#方法1
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def maxDepth(self, root):""":type root: TreeNode:rtype: int"""def depth(p):if p == None:return 1else:return 1 + max(depth(p.right), depth(p.left))if root == None:return 0else:return max(depth(root.right), depth(root.left))#方法2没有通过# 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 maxDepth(self, root):""":type root: TreeNode:rtype: int"""if root == None:return 0else:return 1 + max(maxDepth(root.right), maxDepth(root.left)) #NameError: global name 'maxDepth' is not defined'''
2
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:
•节点的左子树只包含小于当前节点的数。
•节点的右子树只包含大于当前节点的数。
•所有左子树和右子树自身必须也是二叉搜索树。示例 1:
输入:2/ \1   3
输出: true示例 2:
输入:5/ \1   4/ \3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
'''
#方法1
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""def get(root):if root == None:return [0,0]if root.left != None:small = get(root.left)[0]else:small = root.valif root.right != None:big = get(root.right)[1]else:big = root.valreturn [small,big]if root == None:return Trueif root.left != None and get(root.left)[1] >= root.val:return Falseif root.right != None and get(root.right)[0] <= root.val:return Falseif self.isValidBST(root.left) and self.isValidBST(root.right):return Truereturn False#方法2
"""
Definition of TreeNode:
class TreeNode:def __init__(self, val):self.val = valself.left, self.right = None, None
"""
class Solution:"""@param root: The root of binary tree.@return: True if the binary tree is BST, or false"""  def isValidBST(self, root):if root is None:return Trueif root.left is None and root.right is None:return Trueif root.left:if not self.isValidBST(root.left):return Falseelif self.max_val(root.left) >= root.val:return Falseif root.right:if not self.isValidBST(root.right):return Falseelif self.min_val(root.right) <= root.val:return Falsereturn Truedef min_val(self, root):result = root.valwhile root.left:result = root.left.valroot = root.leftreturn resultdef max_val(self, root):result = root.valwhile root.right:result = root.right.valroot = root.rightreturn result# write your code here'''
3
对称二叉树给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2   2/ \ / \
3  4 4  3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2   2\   \3    3说明:如果你可以运用递归和迭代两种方法解决这个问题,会很加分。'''
#方法1
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""def help(p, q):if p == None and q == None:return Trueif p and q and p.val == q.val:return help(p.left, q.right) and help(p.right, q.left)return Falseif root:return help(root.left, root.right)return True
#方法2
# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:# @param root, a tree node# @return a booleandef isSymmetric(self, root):if root:return self.help(root.left, root.right)return Truedef help(self, p,q):if p is None and q is None: return Trueif p and q and p.val == q.val:return self.help(p.left, q.right) and self.help(p.right, q.left)return False方法3
class Solution:def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""def f(p, q):if p == None:return q == Noneif q == None:return p == Noneif p.val == q.val:return f(p.left, q.right) and f(p.right, q.left)if p.val != q.val:return Falseif root == None:return Truereturn f(root.left, root.right)#方法4
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""#思路主要参考leetcode100题,这里将根节点的左右节点假设成两颗独立的树,这样解题跟100就是类似的了,区别:递归调用时,因是对称,所以是左树左节点与右树右节点,左树右节点与右树左节点#先定义,后调用def isSameTree(p,q):if not p and not q:#两二叉树皆为空,递归边界,两者皆为空返回真  return True  if p and q and p.val==q.val:  l=isSameTree(p.left,q.right)#,与leetcode100有区别。递归,每次重新从函数入口处进行,每次进行递归边界判断  r=isSameTree(p.right,q.left)  return l and r#and操作,需要l与r皆为true时,才返回真。只用最后一次递归边界return值  else:  return Falseif not root:return Trueelse:#p=root.left;q=root.rightreturn isSameTree(root.left,root.right)'''
4
二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:
给定二叉树: [3,9,20,null,null,15,7],3/ \9  20/  \15   7返回其层次遍历结果:
[[3],[9,20],[15,7]
][Leetcode] Binary tree level order traversal二叉树层次遍历
'''
#方法1:
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""ans = []def bfs(root,level):if root != None:if len(ans) < level + 1:ans.append([])ans[level].append(root.val)bfs(root.left,level+1)bfs(root.right,level+1)bfs(root,0)return ans#方法2
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def preorder(self, root, level, res):if root:if len(res) < level + 1: res.append([])res[level].append(root.val)self.preorder(root.left, level + 1, res)self.preorder(root.right, level + 1, res)def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""res = []self.preorder(root, 0, res)print resreturn res
方法3:BFS。层序遍历的一般想法,做广度优先遍历(BFS)。遍历的同时,注意记录遍历结果要用满足题目要求的输出格式
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""res = []if root == None:return resq = [root]while len(q) != 0:res.append([node.val for node in q])new_q = []for node in q:if node.left:new_q.append(node.left)if node.right:new_q.append(node.right)q = new_qreturn res
方法4:DFS用深度优先搜索(DFS),节点的深度与输出结果数组的下标相对应。注意在递归的时候要保存每次访问的节点值。
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""res = []self.dfs(root, 0, res)return resdef dfs(self, root, depth, res):if root == None:return resif len(res) < depth+1:res.append([])res[depth].append(root.val)self.dfs(root.left, depth+1, res)self.dfs(root.right, depth+1, res)'''
5
将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:
给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:0/ \-3   9/   /-10  5题目意思:将排序后的数组转换成二叉查找树。二叉查找树的定义:(1)若它的左子树不空,则其左子树上任意结点的关键字的值都小于根节点关键字的值。(2)若它的右子树不空,则其右子树上任意结点的关键字的值都大于根节点关键字的值。(3)它的左、右子树本身又是一个二叉查找树。Description:已知一个按升序排列的数组,将它转换为一个高度平衡二叉树。其中,平衡二叉树(AVL树)被定义为其左子树和右子树都是高度平衡的二叉树,且左子树和右子树的高度之差的绝对值不超过1。解题思路:因为给定的数组是按照升序排列的,所以可以先取出数组中间位置的值作为二叉查找树的根结点,然后以该数组中间位置的值为中心,将左边的数组划分到根结点的左子树中,右边的数组划分到根结点的右子树中,这样就能保证根结点的左子树上任意结点的值都小于根结点的值,右子树上任意结点的值大于根节点的值。接下来,可以使用递归地方法继续取出左边数组的中间值作为根结点的左子结点,右边数组的中间值作为根结点的右子结点,然后以左边数组中间值为中心,再次划分左右子树,右边数组同理,如此递归下去,对于每个结点,总是能保证其左子树上任意结点的值都要小于该节点的值,其右子树上任意结点的值都要大于该节点的值。
'''
#方法1
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def sortedArrayToBST(self, nums):""":type nums: List[int]:rtype: TreeNode"""#递归方法if not nums:return Nonemid=len(nums)//2#找到中间节点root=TreeNode(nums[mid])#当前节点为根节点root.left=self.sortedArrayToBST(nums[:mid])#小于当前根节点的作为左子树root.right=self.sortedArrayToBST(nums[mid+1:])#大于当前根节点的作为右子树return root
#方法2
解题思路:由于要求二叉查找树是平衡的。所以我们可以选在数组的中间那个数当树根root,然后这个数左边的数组为左子树,
右边的数组为右子树,分别递归产生左右子树就可以了。# Definition for a  binary tree node
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:# @param num, a list of integers# @return a tree nodedef sortedArrayToBST(self, num):length = len(num)if length == 0:return Noneif length == 1:return TreeNode(num[0])root = TreeNode(num[length / 2])root.left = self.sortedArrayToBST(num[:length/2])root.right = self.sortedArrayToBST(num[length/2 + 1:])return root
方法2.2
题目思路:将中位数为根节点,中位数左边为左子树,右边为右子树。
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def sortedArrayToBST(self, nums):""":type nums: List[int]:rtype: TreeNode"""size = len(nums)if size == 0:return Noneif size == 1:return TreeNode(nums[0])size //= 2root = TreeNode(nums[size])root.left = self.sortedArrayToBST(nums[:size])root.right = self.sortedArrayToBST(nums[size + 1:])return root

LeetCode Python实现 二叉树简单部分相关推荐

  1. LeetCode Python实现 链表简单部分

    LeetCode Python实现 链表简单部分 我以前完全没有写过关于链表的东西,node.val=node.next.val#当前值被后一个值覆盖node.next=node.next.next# ...

  2. LeetCode 965单值二叉树-简单

    如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树. 只有给定的树是单值二叉树时,才返回 true:否则返回 false. 示例 1: 输入:[1,1,1,1,1,null,1] 输出:tr ...

  3. LeetCode 226翻转二叉树-简单

    翻转一棵二叉树. 示例: 输入: 4/ \2 7/ \ / \ 1 3 6 9 输出: 4/ \7 2/ \ / \ 9 6 3 1 代码如下: /*** Definition for a binar ...

  4. LeetCode 617合并二叉树-简单

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  5. LeetCode 101对称二叉树-简单

    给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1/ \2 2/ \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3 ...

  6. LeetCode 排序和搜索简单部分 Python实现

    #2018-06-07 June Thursday the 23 week, the 158 day SZ #LeetCode 排序和搜索 简单部分 Python实现 '''并两个有序数组 注意题目要 ...

  7. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  8. python实现二叉树非递归前中后序遍历

    python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...

  9. leetcode 中的链表简单题 python3

    目录: 基本使用 // 21题 合并有序链表 // 83题 删除有序链表重复元素 // 141题 环形链表 // 160题 相交链表 // 203题 移除链表元素// 206题 反转链表 // 基本使 ...

最新文章

  1. react表格无缝滚动_js实现表格无缝滚动效果
  2. 【GAN优化】GAN优化专栏栏主小米粥自述,脚踏实地,莫问前程
  3. day21.模块和包
  4. 新增数据时遇到特殊字符
  5. jms、amqp、mqtt区别与联系
  6. Java 8 Optional不仅用于替换空值
  7. 商业项目中代码质量是否重要?
  8. 安装python时需要勾选_一体化污水处理设备安装时需要注意事项
  9. python CV2裁剪图片并保存
  10. 疑似一加7渲染图曝光:弹出式自拍镜头+高颜值渐变配色
  11. iTunes 11.2更新下载:改善播客阅读
  12. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
  13. Easy2d 文档教程之 Visual Studio 安装 Easy2D 游戏引擎
  14. windows安装ffmpeg,yasm,opencv
  15. win11电脑开机密码忘记了怎么办?
  16. (附源码)springboot法律全书 毕业设计 280844
  17. ol+天地图+geoserver_教程:使用GeoServer发布离线地图服务(WMS)
  18. android德地图点聚合,点聚合-点标记-示例中心-JS API 示例 | 高德地图API
  19. PS2018学习笔记(19-24节)
  20. 自动更新word题注

热门文章

  1. 【重难点】【JUC 02】volitale 常用模式 、JUC 下有哪些内容 、并发工具类
  2. 分布式Session的几种实现方式
  3. Android下Cocos2d创建HelloWorld工程
  4. 通过负载均衡器+域名实现容灾切换-(8)基于DNS解析的GSLB在BS架构中应用实践(转)(2)...
  5. 梯度下降、随机梯度下降、方差减小的梯度下降(matlab实现)
  6. ubuntu 18.04 vim的安装
  7. Cognos11中通过URL访问report的设置
  8. 查看一个网站后台是用的什么服务器
  9. Oracle开发›如何取出每个分组的第一条记
  10. commons dbcp.jar有什么用