lintcode448-Inorder Successor in BST

题目描述:

题目意思在BST中找到中序遍历中某一个节点的后继节点。根据BST的特点,BST的中序遍历是一个有序序列。

在此序列中找某一节点的后继,一种普通的方法就是中序遍历该BST,将结果存在数组中,二分查找目标节点的值,然后后一个就是该节点的后继,如果目标节点是数组最后一个元素,则该节点没有后继,返回NULL。

本题想要得到O(h)的复杂度,h为树高。即从树根节点遍历到叶子节点的过程。

思路:cur当前节点,从root开始遍历;parent可能是目标节点的后继节点。

    1)  cur的值比目标节点的值大,目标节点在cur的左子树上,

            这种情况,cur可能是目标节点的后继(目标节点是cur左子树最右节点),让parent标记当前cur,然后cur往左子树遍历。

   2)  cur的值比目标节点的值小,目标节点在cur的右子树上,

            这种情况还要分两种情况:1. parent和cur指向同一个节点,此时parent和cur同时调整为cur的右孩子。

                                                    2. parent和cur不指向同一个节点,这种情况说明parent已经指向可能的后继,只需将cur 调整为cur的右孩子。

  直到cur找到目标节点。

当cur找到目标节点时,三种情况:

1)  cur的右孩子不为空,找到右孩子的最左节点,即为后继节点。

2)  cur的右孩子为空,且parent和cur指向同一节点,说明此节点没有后继,返回NULL。

3)  cur的右孩子为空,parent和cur不指向同一节点,此时parent指向的就是cur的后继节点。

代码:

TreeNode * inorderSuccessor(TreeNode * root, TreeNode * p) {
        // write your code here
        if(root == NULL){
            return NULL;
        }
    
        TreeNode* cur = root;
        TreeNode* parent = root;
        while(cur != p){
            if(cur->val < p->val){
                if(parent == cur){
                    cur = cur->right;
                    parent = cur;
                }
                else{
                    cur = cur->right;
                }
            }
            else{
                parent = cur;
                cur = cur->left;
            }
        }
    
        if(cur->right){      //找到右子树的最左节点
            cur = cur->right;
            while(cur->left){
                cur = cur->left;
            }
            return cur;
        }
        else if(parent == cur){
            return NULL;
        }
        else{
            return parent;
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值