前序/中序/后序线索二叉树寻找前驱后继结点


前言:前序/中序线索二叉树寻找后继结点代码的笔记

前序线索二叉树寻找后继

前驱有很多种情况,太麻烦,自己这里就不写了,因为寻找前驱结点的话,不可能是在当前结点的下面的,因为前序是根左右,左右结点只有可能是后继结点,想要找到该结点的前驱结点就需要先拿到父节点,然后再进行操作,这里只能相关的情况放在这里,就不实现了

这里的前序线索二叉树只实现后继结点的寻找,如下所示

在前序线索二叉树中寻找后继就两种简单的情况,因为前序遍历是根左右

1、第一种情况当要寻找结点P的左子树存在的时候,那么结点P的左节点就是当前结点P的后继结点

2、第二种情况当要寻找结点P的左子树不存在,右子树存在的时候,那么结点P的后继结点就是当前结点P的右节点

3、第三种情况当要寻找结点P的左右子树都不存在,那么结点P就是单结点

上面的三种都是不是叶子结点的时候,如果是叶子结点的话,又因为是线索二叉树,所以对于叶子结点的话直接通过右结点就可以直接找到了

// 中序的后继结点
// 前序后继结点寻找
TreeNode* getAfterNodeFromPre(TreeNode* pTreeNode)
{
	// 直接是叶子结点的情况,那么叶子结点的右子树pRightTreeNode就直接是要找的后继结点
	if (pTreeNode->pLeftTreeNode != NULL && pTreeNode->iRightFlag == 1)
		return pTreeNode->pRightTreeNode;

	// 要找的pTreeNode结点有左孩子,那么该左孩子就是要找的后继结点
	if (pTreeNode->pLeftTreeNode != NULL)
		return pTreeNode->pLeftTreeNode;
	
	// 要找的pTreeNode结点没有左孩子,但是有右孩子,那么该右孩子就是P结点要找的后继结点
	if (pTreeNode->pLeftTreeNode == NULL && pTreeNode->pRightTreeNode)
		return pTreeNode->pRightTreeNode;
	
	// 都不满足的话,那当前的结点就是根节点,并且结点数只有一个
	return NULL;
}

中序线索二叉树寻找前驱后继结点

中序比较简单,只有一种情况,要找的结点的后继结点就是该结点的右子数中最左下的结点,所以直接一个递归就可以进行解决了

需要注意的就是因为是线索二叉树,所以主要不设置Flag条件的话,那么就会造成死循环,因为找的是前驱和后继结点,所以这两个结点

// 获取中序后继结点递归函数
// 中序的后继结点是当前右子树最左下的结点
TreeNode* getAfterNodeFromMiddle(TreeNode* pTreeNode)
{
	if (pTreeNode->pLeftTreeNode != NULL && pTreeNode->iLeftFlag == 0)
		return getAfterNodeFromMiddle(pTreeNode->pLeftTreeNode);
	else
		return pTreeNode;
}

// 获取中序后继结点递归函数
// 中序的前驱结点是当前左子树最右下的结点
TreeNode* getPreNodeFromMiddle(TreeNode* pTreeNode)
{
	if (pTreeNode->pRightTreeNode != NULL && pTreeNode->iRightFlag == 0)
		return getPreNodeFromMiddle(pTreeNode->pRightTreeNode);
	else
		return pTreeNode;
}

// 寻找中序后续结点大函数
TreeNode* findMiddleAfterTreeNode(TreeNode* pTreeNode)
{
	// 如果iRightFlag为1的话,那么当前的结点的右节点就是当前结点的后继结点
	if (pTreeNode->iRightFlag == 1)
		return pTreeNode->pRightTreeNode;
	return getAfterNodeFromMiddle(pTreeNode->pRightTreeNode);
}

// 寻找中序后续结点大函数
TreeNode* findMiddlePreTreeNode(TreeNode* pTreeNode)
{
	if (pTreeNode->iLeftFlag == 1)
		return pTreeNode->pLeftTreeNode;
	return getPreNodeFromMiddle(pTreeNode->pLeftTreeNode);
}

后序线索二叉树寻找前驱

X


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM