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

来源:互联网 发布:手机淘宝开店不成功 编辑:程序博客网 时间:2024/06/07 12:53

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

前序序列(根-左-右):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;}
阅读全文
0 0
原创粉丝点击