LeetCode二叉树实现
LeetCode二叉树实现
# 定义二叉树
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
树的遍历介绍
- 前序遍历
前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。
- 中序遍历
中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。
- 后续遍历
后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。
- 层次遍历
该算法从一个根节点开始,首先访问节点本身。 然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。
class Solution:
# 前序遍历
def solvePre(self, root, result):
if root == None:
return []
result.append(int(root.val)) # 先添加根节点
self.solvePre(root.left, result) # 再添加左子树
self.solvePre(root.right, result) # 再添加又子树
return result
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
return self.solvePre(root, [])
# 中序遍历
def solveIno(self, root, result):
if root == None:
return []
self.solveIno(root.left, result) # 先遍历左子树
result.append(int(root.val))
self.solveIno(root.right, result) # 再遍历右子树
return result
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
return self.solveIno(root, [])
# 后序遍历
def solvePos(self, root, result):
if root == None:
return []
self.solvePos(root.left, result) # 先访问左子树
self.solvePos(root.right, result) # 在访问右子树
result.append(int(root.val))
return result
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
return self.solvePos(root, [])
# 层次遍历
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root == None:
return []
queue = [root] # 通过list存储
result = []
index = 0
while True:
start = index # 该层的节点在list中的开始位置
end = len(queue) # 该层的节点在list中的最后位置
block = [] # 存储该层的数据
for i in range(start, end):
block.append(queue[i].val)
if queue[i].left != None:
queue.append(queue[i].left)
if queue[i].right != None:
queue.append(queue[i].right)
index += 1
if start >= end: # 如果list中的元素被循环完了,即没有添加新的节点
break
result.append(block)
return result
# 最大深度
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root == None:
return 0
leftCount = 1 # 左子树的深度
rightCount = 1 # 右子树的深度
leftCount = leftCount + self.maxDepth(root.left)
rightCount = rightCount + self.maxDepth(root.right)
return max(leftCount, rightCount) # 选深度大的
# 对称二叉树
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
index = 0
queue = [root]
while True: # 获取每层的数据存入list,如果list翻转后和list不一样 则表示不是对称的
start = index
end = len(queue)
block = []
for i in range(start, end):
if queue[i] == None:
block.append(' ') # 这是为了确定某个地方为空的,里面的数据只有不为数字就行
else:
block.append(queue[i].val)
queue.append(queue[i].left)
queue.append(queue[i].right)
index += 1
if block[::-1] != block:
return False
if index >= len(queue):
break
if block.count(' ') == len(block): # 当该层的数据都是空的,则跳出
break
return True
def solveHasPathSum(self, root, sumAll, sum, flag): # 使用深度搜索
if root:
sumAll += root.val
if root.left or root.right: # 当该节点不是叶子节点时
flag = self.solveHasPathSum(root.left, sumAll, sum, flag) | self.solveHasPathSum(root.right, sumAll,
sum, flag)
else:
if sumAll == sum:
return True
return flag
# 路径总和
def hasPathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
return self.solveHasPathSum(root, 0, sum, False)
# 100. 相同的树
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if p == None and q == None:
return True
if p != None and q != None and p.val == q.val: # 如果pq相同,则判断他们的子节点是否也相同
return self.isSameTree(p.left, q.left) & self.isSameTree(p.right, q.right)
return False
# 从前序与中序遍历序列构造二叉树
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if preorder == []:
return None
root = TreeNode(preorder[0]) # 前序遍历的第一个节点是父节点
index = inorder.index(preorder[0]) # 父节点的左边是左子树的,右边是右子树的
root.left = self.buildTree(preorder[1:index + 1], inorder[:index])
root.right = self.buildTree(preorder[index + 1:], inorder[index + 1:])
return root
# 从中序与后序遍历序列构造二叉树
def buildTree(self, inorder, postorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if postorder == []:
return None
root = TreeNode(postorder[-1]) # 后序遍历的最后一个节点是父节点
index = inorder.index(postorder[-1]) # 父节点的左边是左子树的,右边是右子树的
root.left = self.buildTree(inorder[:index], postorder[:index])
root.right = self.buildTree(inorder[index + 1:], postorder[index:-1])
return root
# 每个节点的右向指针 II
def connect(self, root):
if root != None:
index = 0
queue = [root]
while True:
start = index
end = len(queue)
for i in range(start, end):
if i != end - 1: # 如果该层的最后一个节点,则指向空,否则指向后一个节点
queue[i].next = queue[i + 1]
else:
queue[i].next = None
if queue[i].left: # 节点存在则添加,否则不添加
queue.append(queue[i].left)
if queue[i].right:
queue.append(queue[i].right)
index += 1
if index >= len(queue):
break
def isContent(self, root, num): # 判断该树是否有该节点
if root == None:
return False
if root.val == num.val:
return True
return self.isContent(root.left, num) | self.isContent(root.right, num)
# 二叉树的最近公共祖先
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
if root == None or root.val == p.val or root.val == q.val: # 如果根节点是p或q则该节点是lca
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left != None else right
# 序列化
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if root == None:
return []
queue = [root]
result = []
index = 0
nullIndex = 0
while True:
start = index
end = len(queue)
flag = True
for i in range(start, end):
if queue[i] != None:
flag = False
continue
if flag == False:
for i in range(start, end):
if queue[i] == None:
result.append('null')
else:
result.append(queue[i].val)
nullIndex = i
if queue[i].left != None:
queue.append(queue[i].left)
else:
queue.append(None)
if queue[i].right != None:
queue.append(queue[i].right)
else:
queue.append(None)
index += 1
else:
break
return result[:nullIndex + 1]
# 反序列化
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
inputValues = data
if data == []:
return None
root = TreeNode((inputValues[0]))
nodeQueue = [root]
front = 0
index = 1
while index < len(inputValues):
node = nodeQueue[front]
front = front + 1
item = inputValues[index]
index = index + 1
if item != "null":
leftNumber = int(item)
node.left = TreeNode(leftNumber)
nodeQueue.append(node.left)
if index >= len(inputValues):
break
item = inputValues[index]
index = index + 1
if item != "null":
rightNumber = int(item)
node.right = TreeNode(rightNumber)
nodeQueue.append(node.right)
return root
LeetCode二叉树实现的更多相关文章
- LeetCode 二叉树,两个子节点的最近的公共父节点
LeetCode 二叉树,两个子节点的最近的公共父节点 二叉树 Lowest Common Ancestor of a Binary Tree 二叉树的最近公共父亲节点 https://leetcod ...
- leetcode二叉树题目总结
leetcode二叉树题目总结 题目链接:https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/ 前序遍历(NLR) p ...
- [LeetCode] 二叉树相关题目(不完全)
最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...
- LeetCode二叉树的前序、中序、后序遍历(递归实现)
本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...
- LeetCode 二叉树的层次遍历
第102题 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...
- LeetCode 二叉树的锯齿形层次遍历
第103题 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- LeetCode 二叉树的最小深度
计算二叉树的最小深度.最小深度定义为从root到叶子节点的最小路径. public class Solution { public int run(TreeNode root) { if(root = ...
- LeetCode - 二叉树的最大深度
自己解法,欢迎拍砖 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,nu ...
随机推荐
- lua-excel助手
excel是我们工作及生活当中不可或缺的东西,好吧,我是一个游戏程序员,数值哥哥肯定会给我些表格的.回归正题,为什么需要做这个封装? 为什么需要这个项目,因为我们需要使用程序进行自动化操作 VBA我们 ...
- 在switch中的case语句中声明变量编译出错的解决方案
在switch中的case语句中声明变量编译的问题 先来看段代码,别管什么意思: : , j = ; ; i < ; i++) recive_phone[i] = msgbuf.text[i]; ...
- 分享一个SqliteHelper类
分享一个SqliteHelper类 SQLite作为一个本地文件数据库相当好用,小巧.快速.支持事务.关系型,甚至可以运行在Android上.在很久以前的一个项目中,我们用过它来将接收到的数据做本地统 ...
- phonegap的照相机 API
一. Camera Api 简单介绍 Camera 选择使用摄像头拍照,或从设备相册中获取一张照片.图片以 base64 编码的 字符串或图片 URI 形式返回. 方法: 1. camera.getP ...
- datetime.datetime.now()时间格式转化是碰到的问题
import datetime print datetime.datetime.now() # 2016-03-28 17:16:00.812000 a = ‘2016-03-28 17:16:00. ...
- HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others) M ...
- 2spring注解:@Lazy,@Conditional,@import,FactoryBean接口
大致的工程内容也来源于上一篇博文! https://www.cnblogs.com/Mrchengs/p/10108603.html 1.@Lazy懒加载 懒加载:针对单实例的 单实例bean,默认在 ...
- MyBatis(10)逆向工程
什么是逆向工程? 在学习的过程中会发现,需要我们写大量的sql语句 此时mybaatis官方为我们提供逆向工程可以针对单表自动生成的mybatis执行所需要的代码 使用方法: MyBat ...
- easyui分页的使用方法
使用: $("#tt").datagrid("getPager").pagination(option); 例子: $("#tb").dat ...
- 简单使用Spring Boot+JpaRepository+hibernate搭建项目
sql: -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: 10.3.9-M ...