其他分享
首页 > 其他分享> > 面试题9:二叉树的下一个节点

面试题9:二叉树的下一个节点

作者:互联网

目录

1 题目

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

2 思路

image
以上图中的树为例,其中序遍历序列是:d,b,h,e,i,a,f,c,g。
找一个结点在中序遍历序列中的下一个结点共有三种不同的情况:
1)如果一个结点有右子树,那么它的下一个结点就是它的右子树中最左边的那个结点,也就是说,从它的右子结点出发一直访问左指针,最后就可以找到这个最左结点。例如,图中结点b的下一个结点是h,结点a的下一个结点是f。

2)如果一个结点没有右子树,那么需要再进一步考虑,不难知道:如果这个结点是其父结点的左结点,那么根据中序遍历规则,它的下一个结点就是它的父结点。例如,图中结点d的下一个结点是b,f的下一个结点是c。

3)当一个结点既没有右子树,也不是其父结点的左结点时,我们可以沿着指向父结点的指针一直向上遍历,直到找到一个是它自身的父结点的左孩子的结点,如果这样的结点存在,那么这个结点的父结点就是我们要找的下一个结点。例如,为了找到结点g的下一个结点,我们沿着指向父结点的指针向上遍历,先到达结点c。由于结点c是父结点a的右结点,我们继续向上遍历到达结点a。由于结点a是树的根结点。它没有父结点。因此结点g没有下一个结点。

3 代码示例

BinaryTreeNode* GetNext(BinaryTreeNode*pNode)
{
	if(pNode==nullptr)
		return nullptr;
	BinaryTreeNode* pNext = nullptr;
	if(pNode->m_pRight!=nullptr)// 有右子树,那么它的下一个结点就是它的右子树中最左边的那个结点
	{
		BinaryTreeNode* pRight = pNode->m_pRight;
		while(pRight->m_pLeft!=nullptr)
			pRight = pRight->m_pLeft;
		pNext = pRight;
	}else
	{
		BinaryTreeNode* parent = pNode->m_pParent;
		// 没有右子树,且当前节点是父节点的左节点
		if(parent!=nullptr && pNode == parent->m_pLeft)
		{
			pNext = parent;
		}else
		{	// 没有右子树,是其父节点的右子树
			BinaryTreeNode* pCurrent = pNode;
			while(parent!=nullptr && pCurrent = parent->m_pRight)
			{
				pCurrent = parent;
				parent = parnet->m_pParent;
			}
                        pNext = parent;
		}
	}
        return pNext;
}

标签:结点,parent,右子,nullptr,面试题,pRight,pNode,二叉树,节点
来源: https://www.cnblogs.com/qtfy-ydxy/p/14540237.html