数据结构和算法经典100题-第24题

在二叉搜索树中寻找一个节点的后继节点
题目要求
假设有二叉树节点:

class Node {
public:
    Node *parrent;
    Node *left;
    Node *right;
    int value;
    Node(int value) {
        this->value = value;
    }
    ~Node() {};
};

要求寻找其后序节点。
说明:假设中序遍历二叉搜索树的结果是:{1,2,3,4,5,6,7,8,9,10},节点2的后序节点是3,节点3的后序节点是4,节点10的后继节点是NULL。


题目解析:
本题比较简单的办法是直接向上寻找给定节点,找到树的根节点,然后中序遍历树很容易找到后继节点,但这样方法的时间复杂度是O(n),空间复杂度也是O(n)。其实没有必要遍历整棵二叉树,下面介绍一种时间复杂度是O(S),空间复杂度是O(1)的方法,其中S是在搜索过程中走过的距离。
分为两种情况:
1.如果节点有右子树,根据后继节点的定义可知其后继节点一定是右子树最左的节点;
2.如果节点没有右子树,那么根据中序遍历知此时比它大的节点一定是在其上方,如果它是它父亲的左孩子说明紧邻比它大的是它父亲,如果不是那么继续向上找,一致找到根节点为止,根节点没有父节点。


Okay,根据这个思路写出代码,no code say what:

#include <stdio.h>

class Node {
public:
    Node *parrent;
    Node *left;
    Node *right;
    int value;
    Node(int value) {
        this->value = value;
    }
    ~Node() {};
};

Node *getNextNode(Node *node) {
    // 如果node有右子树
    if (node->right) {
        Node *tmp = node;
        while (tmp->left) {
            tmp = tmp->left;
        }
        return tmp;
    } else {
        // 如果node是其父亲的左孩子
        Node *tmp = node;
        while (tmp) {
            if (tmp == tmp->parrent->left) {
                return tmp;
            }
            tmp = tmp->parrent;
        }
    }
    return NULL;
}

路漫漫啊,很久没更新这个数据结构和算法题系列了,今天怒更了四篇啊,明天后天要加班到21点多,回家可能已经23点多了,明天再怒更2篇,这周还有四天,目标是再怒更这个系列20篇。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值