二叉树的下一个节点

  题目来源:《剑指offer》面试题58

  题目:给定一个二叉树和其中一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。

  分析:有如下几种情况:

     如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。

     如果没有右子树,且它是父节点的左子节点,那么它的下一个节点就是它的父节点。

     如果一个节点即没有右子树,并且它还是父节点的右子节点,这种情况比较复杂。我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。

     如果一个节点不满足上述所有情况,那么它应该就是中序遍历的最后一个节点。所以返回NULL

struct BinaryTreeNode {
    int val;
    BinaryTreeNode* parent;
    BinaryTreeNode* left;
    BinaryTreeNode* right;
};

BinaryTreeNode* GetNext(BinaryTreeNode* root) {
    if (root == NULL) return NULL;

    BinaryTreeNode* next_node = NULL;
    //如果节点有右子树,那么它的下一个节点就是它的右子树中最左边的节点
    if (root->right != NULL) {
        next_node = root->right;
        while (next_node->left != NULL) 
            next_node = next_node->left;
        return next_node;
    } 

    if (root->parent != NULL) {
        if (root == root->parent->left) {//当前节点是父节点的左子节点
            return root->parent;
        } else {
            BinaryTreeNode* parent_node = root->parent;
            BinaryTreeNode* current_node = root;
            while (parent_node != NULL && current_node == parent_node->left) {
                current_node = parent_node;
                parent_node = parent_node->parent;
            }

            return parent_node;
        }
    }

    return NULL;
}

 

posted @ 2015-09-02 15:10  vincently  阅读(1124)  评论(0编辑  收藏  举报