Esempio n. 1
0
	BinaryTreeNode* construct(int* preOrder,int* inOrder,int length){
		if(preOrder==NULL||inOrder==NULL||length<=0){
			return NULL;
		}

		return constructCore(preOrder,preOrder+length-1,inOrder,inOrder+length-1);

	}
Esempio n. 2
0
BinaryTreeNode* constructBinaryTree(int* preorder, int* inorder, int length)
{
    if (NULL == preorder || NULL == inorder || length <= 0)
    {
        return NULL;
    }
    
    return constructCore(preorder, preorder + length - 1, inorder, inorder + length - 1);
}
/**
* 创建线索二叉树,根据前序
*/
void BiThr::createBiThr(char *preOrder, char *inOrder, int length)
{
	if (preOrder == nullptr || inOrder == nullptr || length <= 0)
	{
		this->Thrt = nullptr;
	}//if

	//我们把节点返回
	this->Thrt = constructCore(preOrder, preOrder + length - 1, inOrder, inOrder + length - 1);
}
/**
*我们的二叉树构建函数
*@param  int *startPreorder  前序遍历的第一个节点的指针
*@param  int *endPreorder  前序遍历的最后一个节点的指针
*@param  int *startInorder  中序遍历的第一个节点的指针
*@param  int *endInorder  中序遍历的最后一个节点的指针
*@return BinaryTreeNode* 返回我们的根节点
*/
BiThrNode* BiThr::constructCore(char *startPreorder, char *endPreorder, char *startInorder, char *endInorder)
{
	char value = *startPreorder;
	//我们首先为当前的节点创建一个对象
	BiThrNode *btn = new BiThrNode();
	btn->data = value;
	btn->lchild = btn->rchild = nullptr;
	btn->LTag = btn->RTag = BiThrNode::PointerTag::Thread;

	//接下来是我们的递归终止条件
	if (startPreorder == endPreorder)
	{
		if (startInorder == endInorder && *startPreorder == *startInorder)
		{
			//OK,这个已经是叶子节点了
			return btn;
		}
		else
		{
			throw std::exception("前序数列与中序数列不匹配");
		}
	}//if

	char *rootInorder = startInorder;
	//在中序中找到当前根,也就是btn
	while (rootInorder <= endInorder && *rootInorder != value)
	{
		++rootInorder;
	}//while

	//我们看看是找到了,还是到了末尾
	if (rootInorder > endInorder && *rootInorder != value)
	{
		throw std::exception("数据不匹配,不能形成唯一二叉树");
	}//if

	//递归
	int leftlength = rootInorder - startInorder;	//我们中序遍历的左半边
	if (leftlength > 0)
	{
		btn->LTag = BiThrNode::PointerTag::Link;
		btn->lchild = this->constructCore(startPreorder + 1, startPreorder + leftlength, startInorder, rootInorder - 1);
	}
	//右边,右边如果还有元素的话
	if ((endInorder - rootInorder) > 0)
	{
		btn->RTag = BiThrNode::PointerTag::Link;
		btn->rchild = constructCore(startPreorder + leftlength + 1, endPreorder, rootInorder + 1, endInorder);
	}

	//返回根
	return btn;
}