LeetCode(98)验证二叉搜索树(102,107)层次遍历

(98)验证二叉搜索树
二叉树的三种访问方式
1.先序遍历:按照根节点->左子树->右子树的顺序访问二叉树
在这里插入图片描述
先序遍历结果:A BDFE CGHI
思惟过程:
(1)先访问根节点A,node

(2)A分为左右两个子树,由于是递归调用,因此左子树也遵循“先根节点-再左-再右”的顺序,因此访问B节点,web

(3)而后访问D节点,算法

(4)访问F节点的时候有分支,一样遵循“先根节点-再左–再右”的顺序,数组

(5)访问E节点,此时左边的大的子树已经访问完毕,app

(6)而后遵循最后访问右子树的顺序,访问右边大的子树,右边大子树一样先访问根节点C,svg

(7)访问左子树G,3d

(8)由于G的左子树没有,因此接下俩访问G的右子树H,code

(9)最后访问C的右子树Ixml

2.中序遍历:按照左子树->根节点->右子树的顺序访问
在这里插入图片描述
中序遍历结果:DBEF A GHCIblog

3.后序遍历
在这里插入图片描述
后序遍历的结果:DEFB HGIC A

这道题咱们能够使用中序遍历为升序对的解法,先把节点中序排列(左-根-右),再对数组进行遍历,同时判断相邻元素间大小,若是排前面的数大于等于以后的数,说明不是二叉搜索树。

class Solution:
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        self.last_node = float("-inf")
        return self.helper(root)
    
    def helper(self, root):
        
        if not root:
            return True
        
        left = self.helper(root.left)
        
        if root.val <= self.last_node:
            return False
        self.last_node = root.val
        right = self.helper(root.right)
        
        return left and right

在这里插入图片描述
(102)二叉树的层次遍历
思路:二叉树或通常树的水平层次遍历,能够使用BFS(广度搜素)算法,使用队列Queue标记每一层的结点元素;

Queue:先进先出, 后进后出。能够保证每一层遍历时的结点顺序;

BFS:相似于电影中的病毒传染,先感染靠近本身的,再由易感染层感染更外层…(我理解的就是这么个理);

该题二叉树中,先把根结点压入队列,当队列不为空时,移除队首结点,并判断该结点的左右子树中有无非空结点,若存在,则再次入队对应的左右子树结点……同一层的每一个结点循环以上操做,直至队列为空,循环结束。

class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
      
        ret = list()
        if root == None:
            return ret

        from queue import Queue
        q = Queue()
        q.put((root, 0))
        while not q.empty():
            node, level = q.get()

            if level == len(ret):
                ret.append([])
                
            ret[level].append(node.val)

            if node.left != None:
                q.put((node.left, level + 1))

            if node.right != None:
                q.put((node.right, level + 1))

        return ret

在这里插入图片描述

(107)二叉树的层次遍历 II
思路与前一题雷同,就不在赘述。

class Solution:
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        
        q, result = [root], []
        while any(q):
            tmp = list()
            len_q = len(q)
            for _ in range(len_q):
                node = q.pop(0)
                tmp.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

            result.insert(0, tmp)
        return result

在这里插入图片描述