-
//题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}, 则重建二叉树并返回。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { //判定序列是否为零,为零可直接结束 if(pre.size()==0||vin.size()==0) { return nullptr; } //定义Node结点,并确实定根结点 int root=pre[0]; vector<int>::iterator it; TreeNode* node=new TreeNode(root); //1.求左右子树的遍历顺序 vector<int> preright,preleft, vinright,vinleft; vector<int>::iterator i; //(1)求根结点在中序遍历的中的位置 for(it=vin.begin();it!=vin.end();it++) { if(root==*it) i=it; } //(2)求中序遍历的中的左右子树 int k=0; for(it=vin.begin();it!=vin.end();it++) { if(k==0) { vinleft.push_back(*it); } else if (k==1) { vinright.push_back(*it); } else{} if(i==it) k=1; } //(3)求前序遍历序列中的左右子树 vector<int>::iterator ite; k=0; //标志位,用来判断 for(it=pre.begin()+1;it!=pre.end();it++) { for(ite=vinleft.begin();ite!=vinleft.end();ite++) { if(*it==*ite) { preleft.push_back(*it); k=1; } } if(k==0) { preright.push_back(*it); } k=0; } // 根据遍历序列求出根的左右结点 node->left=reConstructBinaryTree(preleft,vinleft); node->right=reConstructBinaryTree(preright,vinright); return node; } };
05-04
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交