您的位置:首页 > 职场人生

面试题58:二叉树的下一个结点

2015-05-04 09:37 239 查看
题目:给定一颗二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。



中序遍历为:DBEFAC

1.结点有左右子树,因为是中序遍历,所以一个结点一定是在右子树中,所以不考虑左子树,直接遍历右子树的最左结点。如A,下一个结点是C

2.结点没有右子树,但是它是父节点的左结点,父节点就是下一个结点,如D

3.结点没有右子树,而且它是父节点的右结点,沿着它父节点向上遍历,直到找到一个是它父节点的左子结点的结点。如F,F的父节点是E,但E是父节点B的右子节点,所以继续往上找,找到B,B是A的左子结点,所以A就是下一个结点,如果没有找到返回NULL。

struct BTNode
{
int value;
BTNode* left;
BTNode* right;
BTNode* parent;
};

BTNode * GetNext(BTNode * node)
{
if(node==NULL)
return NULL;
BTNode * pNext=NULL;
//如果结点的右子树不为空
if(node->right!=NULL)
{
BTNode * currentNode=node->right;
//向下找到最左的结点
while(currentNode->left!=NULL)
{
currentNode=currentNode->left;
}
pNext=currentNode;
}
else if(node->parent!=NULL)//如果结点的父节点不为空
{
BTNode * currentNode=node;
BTNode * parent=node->parent;
//如果当前结点不是它父节点的子节点,就一直向上找,如果是,则它的父节点就是下一个结点
while(currentNode!=parent->left&&parent!=NULL)
{
currentNode=parent;
parent=parent->parent;//向上查找父节点
}
pNext=parent;
}

return pNext;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: