二叉树前驱节点与后继节点

前驱节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的前一个节点为该节点的前驱节点;

后继节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的后一个节点为该节点的后继节点;

例如一颗完全二叉树(1,2,3,4,5,6,7),按照中序遍历后的顺序为:(4,2,5,1,6,3,7),1节点的前驱节点为:5,后继节点为6.

在这里插入图片描述
图1:二叉树
若每次遍历二叉树进行查找前驱节点或后继节点,复杂度太高,需要O(n)的时间复杂度。例如查找5节点的后继节点,则需要对整棵树进行遍历,而真正可以做到的是,只需要经过两者之间的距离就可以找到其后继节点:5\rightarrow 2\rightarrow 1。

因此可以断定:

前驱节点:当前节点左子树的最右节点(例如1节点的前驱节点为5),若无左子树,则:当前节点是其父节点的右子树(5节点的前驱节点为2);

后继节点:当前节点右子树的最左节点(1节点的后继节点为6),若无右子树,则:当前节点为其父节点的左子树(6节点的后继节点为3)。

Java代码:找后继节点:

public class GetSuccessposNode {//找后继节点

public static class Node{

    int value;

    Node parent;

    Node leftNode;

    Node rightNode;

    public Node(int data) {

            this.value = data;

    }

}

public static Node getSuccessNode(Node node) {

    if (node == null) {

            return node;

    }

    if (node.rightNode!=null) {

            return getLeftNode(node.rightNode);

    }else {

            Node parent = node.parent;

            while (parent!=null && parent.leftNode!=node) {

                    node = parent;

                    parent = node.parent;

            }

            return parent;

    }

}

private static Node getLeftNode(Node node) {

    if (node == null) {

            return node;

    }

    while (node.leftNode!=null) {

            node = node.leftNode;

    }

    return node;

}

}

找前驱节点:

public class GetSuccesspreNode {

    public static class Node {

            int value;

            Node parentNode;

            Node leftNode;

            Node rightNode;

            public Node(int data) {

                    this.value = data;

            }

    }

public static Node getSuccessPreNode(Node node) {

    if (node==null) {

            return node;

    }

    if (node.leftNode!=null) {

            return getRightNode(node.leftNode);

    }else {

            Node parent = node.parentNode;

            while (parent!=null && parent.rightNode!=node) {

                    node = parent;

                    parent = node.parentNode;

            }

            return node;

    }

}

private static Node getRightNode(Node node) {

    if (node==null) {

            return node;

    }

    while (node.rightNode!=null) {

            node = node.rightNode;

    }

    return node;

}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值