day17 第六章 二叉树 part05

654.最大二叉树

构造二叉树都是 前序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return None
        return self.traversal(nums, 0, len(nums))

    def traversal(self, nums: List[int], start: int, end: int) -> Optional[TreeNode]:
        # [)
        if start == end:
            return None
        
        max_value = 0
        max_index = start
        for i in range(start, end):
            if nums[i] > max_value:
                max_value = nums[i]
                max_index = i

        root = TreeNode(val = max_value)

        if end-start == 1:
            return root

        # split nums
        left_nums_start = start
        left_nums_end = max_index
        right_nums_start = max_index + 1
        right_nums_end = end

        root.left = self.traversal(nums, left_nums_start, left_nums_end)
        root.right = self.traversal(nums, right_nums_start, right_nums_end)
        return root

617.合并二叉树

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2:
            return None

        node = TreeNode()
        if not root1 and root2:
            node.val = root2.val
            node.left = self.mergeTrees(None, root2.left)
            node.right = self.mergeTrees(None, root2.right)
        elif root1 and not root2:
            node.val = root1.val
            node.left = self.mergeTrees(root1.left, None)
            node.right = self.mergeTrees(root1.right, None)
        else:
            node.val = root1.val + root2.val
            node.left = self.mergeTrees(root1.left, root2.left)
            node.right = self.mergeTrees(root1.right, root2.right)
            
        return node

简洁版

如果t1为空,合并之后就是t2

如果t2为空,合并之后就是t1

直接return 不需要继续

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
        if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
        // 修改了t1的数值和结构
        t1->val += t2->val;                             // 中
        t1->left = mergeTrees(t1->left, t2->left);      // 左
        t1->right = mergeTrees(t1->right, t2->right);   // 右
        return t1;
    }
};

层序

层序:破坏了树状结构,很难重新构造,一般不用于构造树

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        # 层序法: 破坏了树状结构,很难重新构造,还是得用r1或r2已有的结构
        if not root1:
            return root2
        if not root2:
            return root1
        
        q = collections.deque()
        q.append(root1)
        q.append(root2)
        # node = TreeNode()
        while q:
            node1 = q.popleft()
            node2 = q.popleft()
            node1.val += node2.val
            if node1.left and node2.left:
                q.append(node1.left)
                q.append(node2.left)
            if node1.right and node2.right:
                q.append(node1.right)
                q.append(node2.right)
            if not node1.left and node2.left:
                node1.left = node2.left
            if not node1.right and node2.right:
                node1.right = node2.right
            # if node1.left and not node2.left:
            #     node.left = node1.left
            # if node1.right and not node2.right:
            #     node.right = node1.right

        return root1

700.二叉搜索树中的搜索

递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        # 递归
        if not root or root.val == val:
            return root
        if val < root.val:
            return self.searchBST(root.left, val)
        if val > root.val:
            return self.searchBST(root.right, val)

迭代

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        # 迭代
        while root:
            if val < root.val:
                root = root.left
            elif val > root.val:
                root = root.right
            else:
                return root

        return None

98.验证二叉搜索树

二叉搜索树:中序

Pre or max_value should be reset every instance, so it can't be a class variable.

Even if it has to be a class variable, it should be reset every time the instance calls.

class Solution:
    def __init__(self):
        self.pre = None  # 用来记录前一个节点

    def isValidBST(self, root):
        if not root:
            return True
        left = self.isValidBST(root.left)

        if self.pre and self.pre.val >= root.val:
            return False
        self.pre = root  # 记录前一个节点

        right = self.isValidBST(root.right)
        return left and right
class Solution:
    def __init__(self):
        self.max_value = float('-inf')  # 用来记录前一个节点

    def isValidBST(self, root):
        if not root:
            return True
        left = self.isValidBST(root.left)

        if self.max_value >= root.val:
            return False
        self.max_value = root.val  # 记录前一个节点

        right = self.isValidBST(root.right)
        return left and right

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值