返回

深入浅出,用AI算法一键详解LeetCode题解

前端

探索LeetCode二叉树前序遍历算法

在LeetCode的众多编程挑战中,二叉树前序遍历是一个常见的题目。它要求你以特定的顺序访问二叉树中的所有节点,即根节点、左子树和右子树。

理解前序遍历

前序遍历是一种深度优先搜索算法,它按照根-左-右的顺序访问二叉树中的节点。这意味着,它首先访问根节点,然后访问左子树中的所有节点,最后访问右子树中的所有节点。这种遍历方式可以帮助你快速找到二叉树中的某个节点,并了解其在树中的位置。

递归算法

前序遍历可以使用递归算法实现。递归算法是一种将问题分解成更小的子问题,然后逐个解决子问题,最终解决整个问题的方法。在前序遍历中,我们可以将二叉树分解成根节点、左子树和右子树三个部分,然后分别对它们进行前序遍历。

def preorder_traversal(root):
    if root is None:
        return

    # 访问根节点
    print(root.val)

    # 递归访问左子树
    preorder_traversal(root.left)

    # 递归访问右子树
    preorder_traversal(root.right)

迭代算法

除了递归算法,前序遍历还可以使用迭代算法实现。迭代算法是一种通过重复执行某些步骤来解决问题的方法。在前序遍历中,我们可以使用栈来实现迭代算法。栈是一种先进后出(LIFO)的数据结构,它允许我们在栈顶添加和删除元素。

def preorder_traversal_iterative(root):
    stack = []
    while root or stack:
        # 如果根节点不为空,则将其压入栈中
        if root:
            # 访问根节点
            print(root.val)
            # 将右子树压入栈中
            stack.append(root.right)
            # 将左子树压入栈中
            stack.append(root.left)
            # 将根节点设置为右子树
            root = root.right
        # 如果栈不为空,则将栈顶元素弹出并设置为根节点
        else:
            root = stack.pop()

Python和Java代码实现

# Python代码

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def preorder_traversal(root):
    if root is None:
        return

    # 访问根节点
    print(root.val)

    # 递归访问左子树
    preorder_traversal(root.left)

    # 递归访问右子树
    preorder_traversal(root.right)

# 测试代码
root = Node(1)
root.left = Node(2)
root.right = Node(3)
preorder_traversal(root)
// Java代码

class Node {
    int val;
    Node left;
    Node right;

    Node(int val) {
        this.val = val;
    }
}

class PreorderTraversal {

    public static void main(String[] args) {
        // 创建二叉树
        Node root = new Node(1);
        root.left = new Node(2);
        root.right = new Node(3);

        // 前序遍历二叉树
        preorderTraversal(root);
    }

    private static void preorderTraversal(Node root) {
        if (root == null) {
            return;
        }

        // 访问根节点
        System.out.print(root.val + " ");

        // 递归访问左子树
        preorderTraversal(root.left);

        // 递归访问右子树
        preorderTraversal(root.right);
    }
}

更多资料