寻找二叉搜索树中给定节点的下一个节点
题目:给定一个二叉搜索树,节点带有指向父节点的指针域,以中序遍历的方式排序该树,求给定节点的下一个节点。
参考树:
bool isLeftNode(TreeNode *node,TreeNode *parent){
return parent->left == node;
}
TreeNode *leftMostNode(TreeNode *node){
if(node == NULL) return NULL;
while(node->left){
node = node->left;
}
return node;
}
//node是给定的二叉搜索树中的节点
//返回值是Node节点的下一个节点
TreeNode *InorderSuccessor(TreeNode *node){
if(node == NULL) return NULL;
//如果给定节点的右子节点存在,则右子树的最左侧的节点就是要求解的节点
if(node->right){
return leftMostNode(node->right);
}
//给定节点不存在右子树
TreeNode *parent = node->parent;
//parent不为空且node不是父节点的左孩子,则一直向上追溯,
//直到parent为空或者追溯的节点是其父节点的左孩子
while(parent && !isLeftNode(node,parent)){
node = parent;
parent = node->parent;
}
return parent;
}
题目二:在题目一的基础上,如果二叉搜索树中的节点不带有指向父节点的指针域,该如何求解。
//node是给定的节点,root是二叉树的根节点
TreeNode *InorderSuccessor(TreeNode *node,TreeNode *root){
if(root == NULL || node == NULL) return NULL;
if(node->right){
return leftMostNode(node->right);
}
TreeNode *successor = NULL;
while(root){
if(root->val > node->val){
//记录比给定节点值大的节点,随后更新它.
//当root为空的时候,successor记录的节点就是比node值大的节点中的最小节点,即为所求解
successor = root;
root = root->left;
}else{
root = root->right;
}
}
return successor;
}
不知道看文章的你弄懂了吗?不懂的话可以私信我哦!