一、基础知识

二叉树:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林
遍历:
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。
先序遍历:首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树
中序遍历:首先中序遍历左(右)子树,再访问根,最后中序遍历右(左)子树
后序遍历:首先后序遍历左(右)子树,再后序遍历右(左)子树,最后访问根

二、98-验证二叉搜索树

代码:

# 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 isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        inorder = self.inorder(root)
        return inorder == list(sorted(set(inorder)))
        
    def inorder(self, root):
        if root is None:
            return []
        return self.inorder(root.left) + [root.val] + self.inorder(root.right)

运行结果:
训练营第四天--二叉树

三、102.-二叉树的层次遍历

代码:

# 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 levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if(root==None):
            return []
        node=[]
        if(root):
            node.append(root)
        ans=[]
        while(node):
            nodeval=[]
            s=len(node)
            for i in range(s):
                nodepop=node.pop(0)
                nodeval.append(nodepop.val)
                if(nodepop.left):
                    node.append(nodepop.left)
                if(nodepop.right):
                    node.append(nodepop.right)
            ans.append(nodeval)
        return ans

运行结果:
训练营第四天--二叉树

四、107-二叉树的层次遍历 II

代码:

# 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 levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root is None:
            return []
        res=[[root.val]]
        roots=[[root]]
        i=0
        l=len(roots[i])
        while l>0:
            tem=[]
            t=[]
            for j in roots[i]:
                if j.left:
                    tem.append(j.left.val)
                    t.append(j.left)
                if j.right:
                    tem.append(j.right.val)
                    t.append(j.right)
            if len(t)>0:
                res.append(tem)
                roots.append(t)
            i+=1
            l=len(tem)
        return res[::-1]

运行结果:
训练营第四天--二叉树

相关文章: