算法第九题(二叉树)

  1. 验证二叉搜索树
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

# class Solution:
#     def isValidBST(self, root: TreeNode) -> bool:
#         return self.isVaildNode(root)

#     def isVaildNode(self,node):
#         if node is None:
#             return True
        
#         leftbool = (node.left is None) or (node.left.val < node.val)
#         rightbool = (node.right is None) or (node.right.val > node.val)
#         if leftbool and rightbool:
#             leftnode = self.isVaildNode(node.left)
#             rightnode = self.isVaildNode(node.right)
#             return (leftnode and rightnode)
#         else:
#             return False #错误示例

# class Solution:
#     def isValidBST(self, root: TreeNode) -> bool:
#         return self.isValidNode(root,+inf,-inf)

#     def isValidNode(self,node,up,low):
#         if node is None:
#             return True
        
#         if node.val<up and node.val>low:
#             leftbool = self.isValidNode(node.left,node.val,low)
#             rightbool = self.isValidNode(node.right,up,node.val)
#             return (leftbool and rightbool)
#         else:
#             return False

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        self.compare = -inf
        return self.isValidNode(root)
    def isValidNode(self,node):
        if node is None:
            return True
        
        boolleft = self.isValidNode(node.left)
        if node.val<=self.compare:
            return False
        else:
            self.compare = node.val
        boolright = self.isValidNode(node.right)
        return (boolleft and boolright)

错误思路:验证二叉搜索树,直接验证每个节点左节点的val小于root的val,右节点的val大于root的val,这是不对的。

思路1:递归思路,遍历每个节点,为每个节点设置一个上阈值与下阈值,进行判断。
思路2:二叉搜索树的中序遍历的值是排好序的,利用此性质,在中序遍历中进行判断。

  1. 二叉树的锯齿形层次遍历
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if root is None:
            return []
        
        deque= [[root],[]]
        output = [[]]
        i = 0
        while deque[0] or deque[1]:
            if i%2==0:
                if not deque[0]:
                    output.append([])
                    i += 1
                    continue
                node = deque[0].pop()
                if node.left: deque[1].append(node.left)
                if node.right: deque[1].append(node.right)
                output[i].append(node.val)
            else:
                if not deque[1]:
                    output.append([])
                    i += 1
                    continue
                node = deque[1].pop()
                if node.right:deque[0].append(node.right)
                if node.left:deque[0].append(node.left)
                output[i].append(node.val)
        return output

这道题为BFS的一道扩展题,锯齿状即两个BFS,奇数则正向,偶数则负向,用条件判断一下。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值