二叉树的后继节点

public class SuccessorNode{
    public static class Node{
        public int value;
        public Node left;
        public Node right;

        public Node(int data){
            this.value = data;
        }
    }

    public static Node getSuccessorNode(Node node){
        if(node == null){
            return node;
        }
        if(node.right != null){//如果有右子树,那么右子树的最左结点一定是后继结点
            return getLeftMost(node.right);
        }else{//无右子树
            Node parent = node.parent;//一直找父节点,直到该节点是父节点的左孩子
            while(parent != null && parent.right == node){//当父亲为空了还没发现我是我父亲的做孩子,说明该节点是整棵树上的最右节点
                node = parent;
                parent = node.parent;
            }
            return parent;
        }
    }
    public static Node getLeftMost(Node node){
        if(node == null){
            return node;
        }
        while(node.left != null){
            node = node.left;
        }
        return node;
    }
}

后继结点是指中序遍历后的节点。一种方法是暴力先找到头结点,然后往下中序遍历找到后继结点,但是该方法的时间复杂度为N。
二叉树的后继节点_第1张图片

你可能感兴趣的:(数据结构,二叉树)