题目:
给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了由两个分别指向左右节点的指针外,还有一个指向父节点的指针。
中序遍历:先访问当前节点的左子树,再访问当前节点本身,最后访问当前节点的右子树。
因此:
如果给定节点有右子树,则下一个节点是它的右子节点;
如果给定节点没有右子树,需要向上找到一个祖父节点(它是自己父节点的左节点),该祖父节点的父节点就是下一个节点。如果没有找到,返回NULL。
中序遍历顺序为:428591637
如上图中,给定节点9,则无右节点,找到祖父节点2是1的左节点,返回 1 的节点;给定 7 ,最后找到 1 的父节点为NULL,返回NULL
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
BinaryTreeNode* m_pParent;
};
BinaryTreeNode* GetNext(BinaryTreeNode* pNode) {
if (pNode == NULL)
return NULL;
BinaryTreeNode* pNextNode = NULL;
// 有右子树,返回右子树中最左的节点
if (pNode->m_pRight) {
pNextNode = pNode->m_pRight;
while (pNextNode->m_pLeft != NULL) {
pNextNode = pNextNode->m_pLeft;
}
} else if (pNode->m_pParent != NULL) {
//无右子树
BinaryTreeNode* pCurrent = pNode;
BinaryTreeNode* pParent = pNode->m_pParent;
while (pParent != NULL && pCurrent == pParent->m_pRight) {
// 向上找到一个节点(它是自己父节点的左节点)
pCurrent = pParent;
pParent = pCurrent->m_pParent;
}
pNextNode = pParent;
}
return pNextNode;
}
测试案例见:
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 06:27:31