LeetCode(No.98,No102,No107)|python

LeetCode(No.98,No102,No107)

任务:学习三种遍历(前、中、后)及层次遍历,并完成leetcode上的验证二叉搜索树(98)及二叉树 层次遍历(102,107)。
在《用python解决数据结构和算法问题》一书中有关于二叉树的章节,阅读过之后,又在CSDN找了一些大神对python中二叉树的理解,自己才对二叉树有了一定了解。
在这里插入图片描述
A是根,B是左子节点,C是右子节点。而D,E是B的子节点,F,G是C的子节点。
前序遍历:顺序为根——左——右的遍历。
先从根开始,找左;
再以左为根,找左,若无,找右,
再以右为根,找左,若无,找右,若无,找上一级右,以此类推。
顺序为A——BDE——CFG
中序遍历:顺序为左——根——右的遍历。
先从左子节点开始,在左子节点里面,也从左开始。也就是说:上图,从D开始,到B,再到E。
在E之后,到A,再到右子节点里面。从F开始,再到C,之后是G。
顺序为DBE——A——FCG
后序遍历:顺序为左——右——根的遍历。
顺序为DEB——FGC——A
层次遍历:顺序为ABCDEFG。

LeetCode98:

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1:
输入:
2
/ \
1 3
输出: true

思路: 1、递归 2、比较大小
在递归中比较大小,也是说,子节点和根的值比较大小。进入每一个子节点后,调用本身函数,再比较大小。若节点下再无数据,则返回None。

classTreeNode(object):
     def __init__(self, x):
         self.val = x
         self.left = None
         self.right = None
 
classSolution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.valid(root, None, None)
               
    def valid(self, root, min, max):
        if root == None or root.val == None:
            return True
        if (min is not None and root.val <=min) or (max is not None and root.val >= max):
            return False     
   	return self.valid(root.left, min,root.val) and self.valid(root.right, root.val, max)

结果:
在这里插入图片描述
LeetCode102:

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如: 给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7 返回其层次遍历结果:
[ [3], [9,20], [15,7] ]

论坛里都说用队列,那就用队列好了。昨天学习了队列,今天刚好用上。
思路:
1.把根节点入队列
2.在一个循环中,先取出根节点(出队列 + 访问节点)
3. 把根节点的左右节点入队列
队列不为空,记下此时队列中的结点个数temp,temp个结点出队列的同时,记录结点值,并把结点的左右子结点加入队列。输出的即根——左子节点——右子节点的顺序了。

	queue = [root]
        res = []
        if not root:
            return []
        while queue:
            templist = []
            templen =len(queue)
            for i in range(templen):                
                temp = queue.pop(0)
                templist.append(temp.val)
                if temp.left:
                    queue.append(temp.left)
                if temp.right:
                    queue.append(temp.right)
            res.append(templist)
        return res

结果:

在这里插入图片描述
LeetCode107:

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如: 给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7 返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]

这个题目,不就是把上面那个题目的结果倒过来么。。。果断倒过来。
代码:将上面的代码后面 return res改为 return res[::-1]就完事了。
结果:
在这里插入图片描述
学习三天心得:
1、对于新手小白来说,分清楚数据结构和数据存储结构很重要。
2、有一本好书来参考很重要,推荐《用python解决数据结构和算法问题》。
3、知识点之间互相串联很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值