在二叉搜索树中寻找一个节点的后继节点
题目要求
假设有二叉树节点:
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篇。