二叉树求后继

本文介绍了二叉树中寻找后继节点的概念,即中序遍历中一个节点的下一个节点。通过二叉树结构,节点可能有两种情况找到后继:1. 当节点有右子树时,其后继是右子树的最左节点;2. 若没有右子树,需要向上查找父节点,如果该节点是父节点的左孩子,则父节点为后继,否则继续向上找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是后继?

        中序遍历中一个结点的下一个结点,就是后继结点。

        比如:4251367中 4的后继是2 2的后继是5 只有7的后继是null

二叉树的创建增加了一个指向父结点的pointer

public static class Node {
        int val;
        Node left;
        Node right;
        Node parent;    //父结点

        public Node(int val, Node left, Node right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

求后继又两种判断条件

情况一:x结点有右树的时候,x结点的后继是它右树的最左结点

情况二:x结点无右树的时候,x结点向上找父亲并判断是不是父亲的左孩子,如果是返回父亲,不是继续向上找父亲

public static Node getSuccessorNode(Node node) {
        if (node == null) {
            return node;
        }
        if (node.right != null) {//有右孩子
            return getLeftMost(node.right);
        } else { //无右孩子
            Node parent = node.parent;
            //循环判断条件:当parent等于null也就是所以孩子都不是父亲的左孩子,head结点就是当前结点的左孩子,或者找到了孩子是父亲的左孩子
            while (parent != null && parent.left != node) {
                node = parent;
                parent = node.parent;
            }
            return parent;
        }
    }

    private static Node getLeftMost(Node node) {
        if (node == null) {
            return null;
        }
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值