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…

深入理解pthread_cond_wait、pthread_cond_signal

man pthread_cond_wait的解释 LINUX环境下多线程编程肯定会遇到需要条件变量的情况&#xff0c;此时必然要使用pthread_cond_wait()函数。但这个函数的执行过程比较难于理解。 pthread_cond_wait()的工作流程如下&#xff08;以MAN中的EXAMPLE为例&#xff09;&#xff1a;…

LeetCode算法题-Factorial Trailing Zeroes(Java实现)

这是悦乐书的第183次更新&#xff0c;第185篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第42题&#xff08;顺位题号是172&#xff09;。给定一个整数n&#xff0c;返回n&#xff01;中的尾随零数。例如&#xff1a; 输入&#xff1a;3 输出&#xff1a;0 说明…

JavaWeb基础—JS学习小结

JavaScript是一种运行在浏览器中的解释型的编程语言 推荐&#xff1a;菜鸟教程一、简介js:javascript是基于对象【哪些基本对象呢】和和事件驱动【哪些主要事件呢】的语言&#xff0c;应用在客户端&#xff08;注意与面向对象的区分&#xff09; js的三大特点&#xff1a;  交…

Asp.Net 设计模式 之 “简单工厂”模式

主要思想&#xff1a;public static Operation CreateFactory(string ope) { //实例化空父类&#xff0c;让父类指向子类 Operation op null; switch (ope) { case "": op …

UBuntu国内镜像地址下载

http://www.oschina.net/p/ubuntu http://releases.ubuntu.com/ http://mirrors.163.com/ubuntu-releases/14.04/

Effective_STL 学习笔记(十九) 了解相等和等价的区别

find 算法和 set 的 insert 成员函数是很多必须判断两个值是否相同的函数代表&#xff0c; find 对 “相同” 的定义是相等&#xff0c;基于 operator &#xff0c; set::insert 对 “相同” 的定义是等价&#xff0c;通常基于 operator< 。 操作上来说&#xff0c;相等的概…

判断是否获取到手机相机权限

实际运用场景&#xff1a; 上传图片&#xff0c;查看相机设备&#xff0c;使用相机 在做这些操作的时候先调用这段话 AVAuthorizationStatus authStatus [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (authStatus AVAuthorizationStatusRestric…

事物笔记

什么是事务&#xff1a; 一件事情有N个组成单元&#xff0c;执行之后要么同时成功&#xff0c;要么同时失败。 MySQL是一条默认的事务&#xff0c;一条sql语句就是一条事务。------------------------------------------------------------MySQL事务&#xff1a; 1、开启一个事…

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 -*- …

Django 路由

定义&#xff1a; URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表&#xff1b;你就是以这种方式告诉Django&#xff0c;对于这个URL调用这段代码&#xff0c;对于那个URL调用那段代码。 URL配置格式&#xff1a; urlpatter…

Ubuntu默认不进入图形界面

修改 /etc/X11/default-display-manager如果值为/usr/sbin/gdm&#xff0c;(ubuntu12.04 为/usr/sbin/lightdm)则进入图形界面 如果值为false&#xff0c;则进入控制台&#xff08;命令行方式&#xff09;。如果想从控制台进入图形界面&#xff0c;可以在控制台上输入命令 sudo…

读《构建之法》的心得体会

前段时间&#xff0c;我看了《构建之法》的一些内容&#xff0c;有了一些心得体会。 软件工程所讨论的是代码量巨大、涉及人数众多、项目需求多变时所要解决的问题。而在校学生根本就没有这样的环境。而邹欣老师的《构建之法》是我读过的书中最浅显易懂的软件工程书。 在绪论中…

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;先从名字上来看看。“代理”可以理解为“代替”&#…

IPv6检测

1&#xff09;判断服务器是否支持IPv6 &#xff1a; http://ipv6-test.com/validate.php 2&#xff09;检测当前设备打开网站的连接方式是IPv4还是IPv6&#xff1a; http://ipv6.sjtu.edu.cn/ 转载于:https://www.cnblogs.com/superbobo/p/6687605.html

百度首席科学家吴恩达宣布将从百度离职

海外网3月22日电 据媒体消息&#xff0c;百度首席科学家吴恩达&#xff08;Andrew Ng&#xff09;在英文自媒体平台Medium及微博、Twitter等个人社交平台发布公开信&#xff0c;宣布自己将从百度离职&#xff0c;开启自己在人工智能领域的新篇章。 吴恩达是人工智能和机器学习…