2020年11月17日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
题意很明确,就是找中序遍历指定结点的下个结点,而且给出了指向父结点的指针。
分类讨论:
- 当前结点有右子树,下个结点为右子树的最左结点;
- 当前结点无右子树,则向上查找,直到找到左孩子(如果是右孩子,说明父结点已经遍历过了),下个结点为左孩子的父结点。
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
if ( pNode -> right ) //有右子树时,下个结点即为右子树的最左结点
{
BinaryTreeNode* t = pNode -> right ; //右子树
while ( t -> left )
t = t -> left ;
return t ;
}
else //无右子树时,返回父结点(向上查找,下个结点为左孩子的父结点)
{
BinaryTreeNode * par = pNode -> parent ; // 父结点
while ( par && par -> right == pNode ) // 如果当前结点是父结点的右孩子,说明父结点已经遍历过了,继续向上遍历,直到当前结点为左结点
{
pNode = par ;
par = par -> parent ;
} // 退出时,当前结点为父结点的左孩子,所以下个结点就是当前结点的父结点
return par ; // 返回父结点
}
}
参考文献
《剑指offer 第二版》
https://blog.csdn.net/kk55guang2/article/details/86179012