您的位置:首页 > 其它

由前序遍历和中序遍历重构二叉树

2017-07-31 23:42 218 查看

由前序遍历和中序遍历重建二叉树

前序序列(根-左-右):1 2 3 4 5 6

中序序列(左-根-右):3 2 4 1 6 5

1、由前序遍历可知根节点为第一个元素1,在中序遍历序列中找到1对应位置,则1的左边就是左子树3 2 4,右边就是右子树6 5;

2、在找到前序遍历序列中从第二个位置开始往后找相同数目的节点为左子树2 3 4,剩余的就是右子树序列6 5;

3、根据前序遍历规则可知,左子树序列里第一个就是左子树的根节点2,右子树序列里的第一个就是有右子树的根节点5;

4、根据中序遍历序列可知,左子树的根节点2左边的一定是以其为根节点的左子树序列3,右边就是以其为根节点的右子树序列4,右子树的根节点5左边的一定是以其为根节点的右子树序列6

struct BinaryTreeNode
{
int _data;
BinaryTreeNode * _pLeftChild;
BinaryTreeNode* _pRighChild;
};

BinaryTreeNode* RebuildBinaryTree(int* PreOder, int*InOrder, int length)
{
if (PreOder == NULL || InOrder == NULL || length <= 0)
return NULL;
_RebuildBinaryTree(PreOder, PreOder + length - 1, InOrder, InOrder + length - 1);
}
BinaryTreeNode* _RebuildBinaryTree(int* startPre, int* endPre, int* startIn, int* endIn)
{
//根据前序遍历保存根节点
BinaryTreeNode *pRoot;
pRoot = new BinaryTreeNode();
pRoot->_data = startPre[0];
pRoot->_pLeftChild = NULL;
pRoot->_pRighChild = NULL;
//判断是否找完了此次中序遍历,若是找完了,则返回pRoot;
if (startIn == endIn&&*startIn == *endIn)
return pRoot;
//在中序遍历中找根节点所在的位置
int* pRootIn = startIn;
while (*startPre != *pRootIn)
pRootIn++;
//根据根节点在中遍历中的位置,递归还原左子树
int leftlen = pRootIn - startIn;
if (leftlen > 0)
{
pRoot->_pLeftChild = _RebuildBinaryTree(startPre + 1, startPre + leftlen, startIn, startIn + leftLen);
}
//左子树长度加上中序的起始位置后若仍小于整个中序长度,则说明该节点右子树存在,递归还原右子树
if (leftlen + startIn < endIn)
{
pRoot->_pRighChild = _RebuildBinaryTree(startPre+leftlen+1,endPre,startIn+leftlen+1,endIn);
}
return pRoot;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐