二叉树 后继节点

123 阅读1分钟

image.png

/**后继结点*/
- (Node *)successorNode:(Node *)node {
    if (node == nil) {
        return  nil;
    }
    
    Node *pNode = node.right;
    //前驱结点在右子树里 (right.left.left.left......)
    if (pNode != nil) {
        while (pNode.left != nil) {
            pNode = pNode.left;
        }
        return pNode;
    }

    while (node.parent != nil && node == node.parent.right) {
        node = node.parent;
    }
    
    //node.parent == nil
    //node == node.parent.left
    
    return node.parent;
}