根据前序和中序重建二叉树

解题思路:

  1. 根据前序遍历的特点“根,左,右”,得出前序遍历的第一个节点就是整棵树的根
  2. 根据中序遍历的特点“左,根,右”,找到中序遍历中和根节点相同的节点,也就是根节点的位置
  3. 在中序中,根节点左边的为整棵树的左子树,根节点后边的为整棵树的右子树,同时也就确定了左右子树的数量
  4. 在前序遍历和中序遍历中划分了左右子树节点的值之后,再用递归的方法分别构建左右子树

例如:

 

 c代码如下:

typedef struct TreeNode
{ 
	struct TreeNode *pLeft;
	struct TreeNode *pRight;
	char data;
}TreeNode;

TreeNode * CreateNode(char data)
{
	TreeNode *pNode = (TreeNode *)malloc(sizeof(TreeNode));
	assert(pNode != NULL);
	pNode->pLeft = pNode->pRight = NULL;
	pNode->data = data;

	return pNode;
}
TreeNode *CreateTreeByPreAndIn(
	char preOrder[],int preOrdersize,
	char inOrder[],int inOrdersize)
{
	if (preOrdersize < 0)
	{
		return NULL;
	}
	//根节点的值
	char  root = preOrder[0];
	//在中序中找根节点的位置
	int i;
	for (i = 0; i < inOrdersize; i++)
	{
		if (root == inOrder[i])
		{
			break;
		}
	}
	//如果找不到,代表这棵树不存在
	if (i == inOrdersize)
	{
		return NULL;
	}
	////找到后构建整棵树的根节点
	//TreeNode *pRoot = (TreeNode*)malloc(sizeof(TreeNode));
	//assert(pRoot);
	//pRoot->data = root;
	//pRoot->pLeft = pRoot->pRight = NULL;
	TreeNode *pRoot = CreateNode(root);
	//递归的构建左右子树
	pRoot->pLeft = CreateTreeByPreAndIn(
		preOrder + 1, i,
		inOrder, i);
	pRoot->pRight = CreateTreeByPreAndIn(
		preOrder + 1 + i, preOrdersize - 1 - i,
		inOrder + 1 + i, inOrdersize - 1 - i);
	return pRoot;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值