📌  相关文章
📜  在二叉树中打印从根到叶的最长路径(1)

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

在二叉树中打印从根到叶的最长路径

在二叉树中,从根节点到叶节点的路径是指从根节点开始,经过一系列边连接的节点构成的路径,直到到达叶节点为止。本文将介绍如何在二叉树中打印从根到叶的最长路径。

思路

可以通过深度优先遍历的方法来求解从根节点到叶节点的最长路径。

具体过程如下:

  • 定义一个栈和一个变量max_depth,分别用来记录当前的遍历路径和最长路径的深度。
  • 从根节点开始进行深度优先遍历。对于每个访问到的节点,将其入栈。
  • 若当前节点为叶节点,则比较当前遍历路径的深度和最长路径的深度,如果当前遍历路径的深度大于最长路径的深度,将栈中的元素记录下来。
  • 如果当前节点不是叶节点,则继续递归访问其左子树和右子树。
  • 递归返回时,将栈顶元素弹出。
代码实现

以下是Java代码实现:

public List<TreeNode> printPath(TreeNode root) {
    List<TreeNode> maxPath = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    int maxDepth = 0;
    int depth = 0;
    TreeNode prev = null;

    while (root != null || !stack.isEmpty()) {
        if (root != null) {
            depth++;
            stack.push(root);
            root = root.left;
        } else {
            TreeNode peekNode = stack.peek();
            if (peekNode.right != null && prev != peekNode.right) {
                root = peekNode.right;
            } else {
                if (peekNode.left == null && peekNode.right == null && depth > maxDepth) {
                    maxDepth = depth;
                    maxPath = new ArrayList<>(stack);
                }
                depth--;
                prev = stack.pop();
            }
        }
    }
    return maxPath;
}

其中,TreeNode为二叉树的节点,具体代码中未给出。

时间复杂度

对于一颗n个节点的二叉树,每个节点最多入栈一次,出栈一次,因此时间复杂度为O(n)。

参考文献

[1] https://www.geeksforgeeks.org/print-the-longest-path-from-root-to-leaf-in-a-binary-tree/