题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点。二叉树的定义如下:
template<typename T> struct BinaryTreeNode{ T data; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(T t=T()):data(t),left(NULL),right(NULL) {} };
分析
对比二叉树的图形和其两个遍历序列来看,可以发现在前序遍历序列中第一个数字总是二叉树的根节点的值,然后在中序遍历序列中找到该值,它的前面就是它左子树上节点值的集合,后面就是它右子树上节点值的集合。由此就可以递归地在这两个集合中建立二叉树。
BinaryTreeNode<data_type>* ConstructBinaryTree(vector<data_type>::iterator vlr,vector<data_type>::iterator lvr,int size) { if(size<=0) return NULL; BinaryTreeNode<data_type>* CurRoot=new BinaryTreeNode<data_type>(vlr[0]); vector<data_type>::iterator it=lvr; while(it!=lvr+size && *it!=CurRoot->data) it++; if(*it==CurRoot->data) { CurRoot->left=ConstructBinaryTree(vlr+1,lvr,it-lvr); CurRoot->right=ConstructBinaryTree(vlr+(it-lvr)+1,it+1,size-(it-lvr)-1); } return CurRoot; }
以上
如果你有任何想法或是可以改进的地方,欢迎和我交流!
完整代码及测试用例在github上:点我前往