Leetcode之二叉树(前200道)

持续更新...

github链接:https://github.com/x2mercy/Leetcode_Solution

 

为什么括号200道呢!因为准备按照200道这样的周期刷,每200道刷两遍,第一遍按难度刷,第二遍按类别刷!

先整理binarytree这一类别也是因为在刷题的过程中,由于没有系统的算法基础,这类题目算是遇到的比较大的障碍。

下面按照题目难度来说:

——————————————————————————————————————————————————————————————————————————————————————

EASY:

1. Same Tree:

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

这是我做的第一道二叉树的题目。

一开始的思路是二叉树的遍历,找到的资料:http://blog.csdn.net/bone_ace/article/details/46718683 主要说了树的构造和几种遍历方式

所以第一种方法是用层次遍历做的,代码如下:

# this solution is Time Limit Exceeded
# 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 isSameTree(self, p, q):""":type p: TreeNode:type q: TreeNode:rtype: bool"""result1=[]result1.append(p.val)while p:if p.left!=None:result1.append(p.left)if p.right!=None:result1.append(p.right)result2=[]result2.append(q.val)while q:if q.left!=None:result1.append(q.left)if q.right!=None:result1.append(q.right)result=cmp(result1,result2)if result==0:return Trueelse:return False

满心欢喜的以为可以过,但是却报了time limit exceed的错误,于是开始找第二种方法!

上代码:

# 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 isSameTree(self, p, q):""":type p: TreeNode:type q: TreeNode:rtype: bool"""if p==None and q==None:return Trueif p==None or q==None:return Falseif p.val==q.val:return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)return False

这种做法写完之后呢。。emmmm觉得自己上一种方法简直是智障儿童

这种方法很简单呐,重点是用了递归。递归真是一种逻辑简洁的好东西,利用递归比较子树的各个节点是否相同。

2. Symmetric Tree:

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

先上代码:

# recursive answer
# 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"""if root==None:return Truereturn self.isMirror(root.left,root.right)def isMirror(self,p,q):if p==None and q==None:return Trueif p==None or q==None:return Falsereturn p.val==q.val and self.isMirror(p.left,q.right) and self.isMirror(p.right,q.left)

这道题的重点在于调用了另一个函数,因为需要比较是否对称的本质是比较左子树的左节点和右子树的右节点、左子树的右节点和右子树的左节点是否相等,所以需要调用IsMirror函数,可以接收两个arg,isMirror返回的boolean值主要由节点值是否相等以及下个节点是否对称来决定,所以这里用了递归。

注意:用了递归,就一定要有递归停止的条件,不能无限循环下去

3.  Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth.

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

这道题算法很经典,mark一下,可以用在很多二叉树的题目中。

上代码:

#iterator
# 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"""if root==None:return 0DL=self.maxDepth(root.left)DR=self.maxDepth(root.right)return max(DL,DR)+1

后面还有一道求最短路径的题目,和这个做法类似

主要也是用了递归,最后返回的时候注意要+1,因为返回的是节点数

4. Binary Tree Level Order Traversal II

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

# 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 levelOrderBottom(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []p=collections.deque()p.append((root,0))result=[]while p:node,index=p.popleft()if index>len(result)-1:result.append([node.val])else:result[index].append(node.val)if node.left:p.append((node.left,index+1))if node.right:p.append((node.right,index+1))result.reverse()return result        

这里本来想用queue,但是发现了一个很神奇的东西:deque(学疏才浅。。),是python标准库里的一项,直接from collections import deque,或者像我这样collections.deque就可以用了。

它的好处在于,它可以提供类似于list的操作,比如append什么的,但是不同的是可以popleft操作,使第一位元素pop出来。(参考:http://blog.csdn.net/qins_superlover/article/details/44338415)

这一种操作对解决二叉树问题,提供了很大的帮助!比如这道题!

这道题是让我们把整个二叉树倒过来,返回从最底层到最上层的节点,给的例子是这样的:

 于是我们知道了在append节点时,需要注意把它的index也append进去,这样便于后面判断是不是同一层的节点。

因为父节点下面的两个子节点的index是一样的,所以在append左边节点之后,会出现len(result)-1是大于右边节点index的,这时直接把右边节点append到result[index]中,等于是个多维array

最后再reverse一下,返回,搞定

5. Convert Sorted Array to Binary Search Tree:

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

这里第一次遇到平衡二叉树,所谓平衡二叉树要满足几个条件:它是一棵空树或它的左右两个子树的高度差的绝对值不超过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 nums==[]:return Nonemid=len(nums)//2root=TreeNode(nums[mid])root.left=self.sortedArrayToBST(nums[:mid])root.right=self.sortedArrayToBST(nums[mid+1:])return root

 

 其实这道题很简单,核心就是要找到根节点,而因为是sortedarray所以要找根节点,就直接找中间的那个元素,为了避免麻烦,用了"//",表示取商的整数部分

然后分别对左子树和右子树用递归,这里的nums[:mid]和nums[mid+1:],表示nums从下标为0到mid(不包括mid),nums从下标mid+1到最后

6. Balanced Binary Tree

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 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 isBalanced(self, root):""":type root: TreeNode:rtype: bool"""if root==None:return TrueDL=self.depth(root.left)DR=self.depth(root.right)if DL-DR<-1 or DL-DR>1:return Falsereturn self.isBalanced(root.left) and self.isBalanced(root.right)def depth(self,node):if node==None:return 0DL=self.depth(node.left)DR=self.depth(node.right)return max(DL,DR)+1

 这里要注意的是判断是否为平衡二叉树,需要考虑一个节点左右子树是否都为平衡二叉树,所以在返回时需要用and来实现

调用了depth函数(前面说了,这个函数很经典很常用)

然后就是在比较高度时,要注意-1的情况

7. Minimum Depth of Binary Tree

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

# 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 minDepth(self, root):""":type root: TreeNode:rtype: int"""if root==None:return 0DL=self.minDepth(root.left)DR=self.minDepth(root.right)d=min(DL,DR)D=max(DL,DR)if DL==0 or DR==0:return D+1else:return d+1

看吧,这个算法真的很常用

但是要注意的是:如果某一子树路径为0, 则取左右子树中最大的那个,如果都不为0,则取左右子树中最小的那个

8. Path Sum:

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

# 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 hasPathSum(self, root, sum):""":type root: TreeNode:type sum: int:rtype: bool"""if root==None:return Falseif root.right==None and root.left==None and root.val==sum:return Truesum=sum-root.valreturn self.hasPathSum(root.left,sum) or self.hasPathSum(root.right,sum)
这道题最开始想复杂了,一直在想用deque(),然后一个一个节点加,但其实不用,cheat了一下,看了dicuss,发现了机智的做法!
只需要依次比较每个节点,比较完之后,sum减去这个节点,然后比较下一个(左或者右),直到sum=某个节点,则返回true
否则返回false
重点在于每次都需要sum减去这个节点值!这样如果剩下的节点值等于这个数,并且!它没有左右子树,则返回true

 ————————————————————————————————————————————————————————————————————————————————————

 

转载于:https://www.cnblogs.com/x1mercy/p/7802167.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在ARM Linux下使用GPIO模拟SPI时序详解

Author&#xff1a;杨正 Data&#xff1a;2016.1.1 Mail&#xff1a;yz2012wwgmail.com一、 概述 SPI是英文SerialPeripheral Interface的缩写&#xff0c;顾名思义就是串行外围设备接口。SPI是一种高速、全双工、同步通信总线&#xff0c;标准的SPI有4个引脚&#xff…

git clone时出现 error:inflate:data stream error(incorrect data check)

git clone时出现 error:inflate:data stream error(incorrect data check) fatal:serrious inflate inconsistency fatal:index-pack failed 经了解&#xff0c;此问题是遗留问题&#xff0c;之前是因为公司对gitlab服务器进行数据迁移而引起这种git clone失败的原因&#xff0…

CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)

一、安装方式介绍 1、yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面&#xff0c;使用 yum 安装&#xff0c;好处是简单&#xff0c;坏处也很明显&#xff0c;需要官方更新 yum 源才能获得最新版本的软件&#xff0c;而所有软件的依赖又不能自己指…

zbb20171108 tomcat 性能优化

原文地址http://www.cnblogs.com/NiceTime/p/6665416.html 1)内存优化(调整配置堆的大小&#xff0c;修改文件&#xff1a;catalina.sh) JAVA_OPTS"-Djava.awt.headlesstrue -Dfile.encodingUTF-8 -server -XX:MinHeapFreeRatio80 -XX:MaxHeapFreeRatio80 -XX:ThreadStack…

Python Socket通信黏包问题分析及解决方法

参考&#xff1a;http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 1.黏包的表现(以客户端远程操作服务端命令为例) 注&#xff1a;只有在TCP协议通信的情况下&#xff0c;才会产生黏包问题 基于TCP协议实现的黏包 #!/usr/bin/env python # -*- coding: utf-8 -*- …

2440内存管理

title: 2440内存管理 tags: ARM date: 2018-10-17 19:08:49 --- 2440内存管理 特性 大/小端&#xff08;通过软件选择&#xff09;地址空间&#xff1a;每个 Bank 有 128M 字节(总共 1G/8 个 Bank)除了 BANK0&#xff08;16/32 位&#xff09;之外【引导ROM&#xff0c;其总线宽…

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

一、引言 今天我们要讲【结构型】设计模式的第七个模式&#xff0c;也是“结构型”设计模式中的最后一个模式&#xff0c;该模式是【代理模式】&#xff0c;英文名称是&#xff1a;Proxy Pattern。还是老套路&#xff0c;先从名字上来看看。“代理”可以理解为“代替”&#…

CentOS7.5 使用二进制程序部署Kubernetes1.12.2(三)

一、安装方式介绍 1、yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面&#xff0c;使用 yum 安装&#xff0c;好处是简单&#xff0c;坏处也很明显&#xff0c;需要官方更新 yum 源才能获得最新版本的软件&#xff0c;而所有软件的依赖又不能自己指…

马来西亚热情拥抱阿里巴巴 马云倡议的eWTP首次落地海外

摘要&#xff1a;3月22日&#xff0c;马来西亚总理纳吉布与阿里巴巴集团董事局主席马云一同出现在吉隆坡一场盛大启动仪式上&#xff0c;他们将共同见证马云的eWTP理念落地马来西亚。 3月22日&#xff0c;在邀请阿里巴巴集团董事局主席马云、阿里巴巴集团CEO张勇、蚂蚁金服集团…

随便玩玩之PostgreSQL(第一章)PostgreSQL简介

随便玩玩之PostgreSQL 未经授权不得转载 第1章PostgreSQL简介 1.1什么是PostgreSQLPostgresql是数据库&#xff08;软件&#xff09;。The worlds most advanced open source database.世界上最先进的开源数据库。 1.2PostgreSQL的优势随便用、不要钱 比MySQL好&#xff0c;媲美…

生产环境中Oracle常用函数总结

1>to_char,将日期转换为字符&#xff1b;add_months,在第一个参数的日期上加或者减第二个参数的值&#xff1b;select dkzh,jkhtbh,yhkrq,dkffrq,shqs,dqyqcs,to_char(add_months(dkffrq,shqsdqyqcs1),yyyymm) from grdk_dk_zz a where a.dkzt in(02,03) and jgbm like 01||…

Dockerfile构建容器镜像 - 运维笔记

在Docker的运用中&#xff0c;从下载镜像&#xff0c;启动容器&#xff0c;在容器中输入命令来运行程序&#xff0c;这些命令都是手工一条条往里输入的&#xff0c;无法重复利用&#xff0c;而且效率很低。所以就需要一 种文件或脚本&#xff0c;我们把想执行的操作以命令的方式…

201421123042 《Java程序设计》第8周学习总结

1. 本周学习总结 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合相关内容。 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码&#xff1a; 答&#xff1a;查找对象是否再数组中&#xff0c;并且返回在数组中的下标。如果不在数…

Linux学习-11月12日(Apache安装)

2019独角兽企业重金招聘Python工程师标准>>> 11.6 MariaDB安装 11.7/11.8/11.9 Apache安装 扩展 apache dso https://yq.aliyun.com/articles/6298 apache apxs https://wizardforcel.gitbooks.io/apache-doc/content/51.html apache工作模式 https://blog.csdn.…

Linux C 读取文件夹下所有文件(包括子文件夹)的文件名

本文&#xff1a;http://www.cnblogs.com/xudong-bupt/p/3504442.html Linux C 下面读取文件夹要用到结构体struct dirent&#xff0c;在头#include <dirent.h>中&#xff0c;如下&#xff1a; #include <dirent.h> struct dirent {long d_ino; /* inode number 索…

报表工具实现单据套打

【摘要】 单据套打再也不用手动测量&#xff0c;反复调试了&#xff0c;报表工具实现单据套打&#xff0c;去乾学院看个究竟&#xff1a;报表工具实现单据套打!实际项目开发中&#xff0c;很多情况会涉及到单据的打印。即在一张印刷好的空白单据上&#xff0c;准确无误地打印上…

session机制详解以及session的相关应用

session是web开发里一个重要的概念&#xff0c;在大多数web应用里session都是被当做现成的东西&#xff0c;拿来就直接用&#xff0c;但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求&#xff0c;当碰到这样的情况时候我们需要更加深入的理解session的机制&am…

(转)Shell中获取字符串长度的七种方法

Shell中获取字符串长度的七种方法 原文&#xff1a;http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用&#xff0c;下面归纳、汇总了求字符串的几种可能方法: 【方法一】:利用${#str}来获取字符串的长度 【方法二】:利用awk的length方…

linux下用core和gdb查询出现段错误的地方

有些时候我们在一段C代码的时候&#xff0c;由于对一个非法内存进行了操作&#xff0c;在程序运行的过程中&#xff0c;出现了"段错误"。呵呵&#xff0c;这种问题我想很多人会经常遇到。遇到这种问题是非常无语的&#xff0c;只是提示了"段错误"&#xff…

什么是js的严格模式

设立严格模式的原因&#xff1a; - 消除Javascript语法的一些不合理、不严谨之处&#xff0c;减少一些怪异行为; - 消除代码运行的一些不安全之处&#xff0c;保证代码运行的安全&#xff1b; - 提高编译器效率&#xff0c;增加运行速度&#xff1b; - 为未来新版本的Javascrip…