不带parent指针的successor(后继)求解
发布日期:2021-05-07 22:02:53 浏览次数:22 分类:精选文章

本文共 1657 字,大约阅读时间需要 5 分钟。

为了找到二叉树中指定结点的下一个结点(即中序遍历的后继),我们可以采用中序遍历的方法。以下是详细的解决方案:

方法思路

我们可以使用中序遍历的非递归实现来解决这个问题。中序遍历的非递归形式使用栈来模拟递归过程,这样我们可以在中序遍历过程中记录节点的顺序。当我们找到目标节点时,记录下一个弹出节点的值作为后继。

具体步骤如下:

  • 初始化一个栈,压栈顺序为根节点。
  • 进行中序遍历,先遍历左子树,再遍历当前节点,最后遍历右子树。
  • 在弹出节点时,检查是否是目标节点,如果是,记录下一个弹出节点的值作为后继。
  • 如果在弹出过程中没有找到目标节点,返回-1。
  • 解决代码

    import java.util.Stack;public class Main {    public static void main(String[] args) {        TreeNode root = new TreeNode(10);        TreeNode l = new TreeNode(7);        TreeNode r = new TreeNode(14);        TreeNode ll = new TreeNode(1);        TreeNode lr = new TreeNode(9);        TreeNode rl = new TreeNode(13);        TreeNode rll = new TreeNode(11);        root.left = l;        root.right = r;        l.left = ll;        l.right = lr;        r.left = rl;        rl.left = rll;        System.out.println(findSuccessor(root, 14));    }    private static int findSuccessor(TreeNode root, int p) {        if (root == null) return -1;        Stack
    stack = new Stack<>(); stack.push(root); boolean found = false; while (!stack.isEmpty()) { while (!stack.isEmpty()) { TreeNode node = stack.pop(); if (node.val == p) { found = true; } if (found) { return node.right != null ? node.right.val : -1; } if (node.right != null) { stack.push(node.right); } } } return -1; }}

    代码解释

  • 初始化栈:将根节点压入栈中。
  • 遍历过程:在弹出节点时,首先检查是否是目标节点。如果是,记录下一个弹出节点的值作为后继。
  • 处理右子树:如果当前节点不是目标节点,继续压栈右子树节点,进行后续遍历。
  • 返回结果:如果在弹出过程中找到目标节点,返回下一个弹出节点的值;否则返回-1。
  • 这种方法高效且简洁,能够在O(n)时间复杂度内找到中序遍历的后继节点。

    上一篇:中序遍历的总结
    下一篇:二叉树中序遍历的非递归算法

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月18日 09时29分42秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章