📌  相关文章
📜  在二叉树中接收奇数节点(1)

📅  最后修改于: 2023-12-03 15:23:28.955000             🧑  作者: Mango

在二叉树中接收奇数节点

如果你需要在二叉树中接收奇数节点,有多种方法可以实现。

方法一:深度优先搜索

深度优先搜索是一种递归的算法,可以用于遍历二叉树。在遍历过程中,每当遇到一个奇数节点时,将其加入到结果列表中。

class Solution:
    def __init__(self):
        self.res = []
        
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        if root.val % 2 == 1:
            self.res.append(root.val)
        self.preorderTraversal(root.left)
        self.preorderTraversal(root.right)
        return self.res

该算法的时间复杂度为 $O(N)$,其中 $N$ 是二叉树节点的数量。

方法二:广度优先搜索

广度优先搜索是一种迭代的算法,可以用于遍历二叉树。在遍历过程中,每当遇到一个奇数节点时,将其加入到结果列表中。

class Solution:
    def __init__(self):
        self.res = []
        
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        queue = [root]
        while queue:
            node = queue.pop(0)
            if node.val % 2 == 1:
                self.res.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return self.res

该算法的时间复杂度为 $O(N)$,其中 $N$ 是二叉树节点的数量。

方法三:迭代器

你可以创建一个迭代器,遍历二叉树并返回每个奇数节点。

class Solution:
    def __init__(self):
        self.stack = []
        
    def __iter__(self):
        return self
    
    def __next__(self):
        if not self.stack:
            raise StopIteration
        node = self.stack.pop()
        if node.val % 2 == 1:
            return node.val
        if node.right:
            self.stack.append(node.right)
        if node.left:
            self.stack.append(node.left)
        return next(self)
    
    def oddNodes(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        self.stack.append(root)
        return list(self)

该算法的时间复杂度为 $O(N)$,其中 $N$ 是二叉树节点的数量。

以上是在二叉树中接收奇数节点的几种方法。根据实际情况选择最适合的算法。