二叉树——已知中序和前序,重构二叉树
重建二叉树
http://www.nowcoder.com/questionTerminal/8a19cbe657394eeaac2f6ea9b0f6fcf6
/** * 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(vin.size()==0)return NULL; vector<int> pre_left,pre_right,vin_left,vin_right; int i = 0; for (int ii = 0;ii<vin.size();ii++) { if(vin[ii]==pre[0]) { i = ii; break; } } //i已经找到 for(int j = 0;j<i;j++) { vin_left.push_back(vin[j]); pre_left.push_back(pre[j+1]);//这里是代表第一位是根节点 } for(int j=i+1;j<vin.size();j++) { vin_right.push_back(vin[j]); pre_right.push_back(pre[j]); } TreeNode* result = new TreeNode(pre[0]); result->left = reConstructBinaryTree(pre_left,vin_left); result->right = reConstructBinaryTree(pre_right,vin_right); return result; } };
前序:根左右
中序:左根右
后序:左右根
思路:
①首先找到前序的第一个,也就是整个二叉树的根
②再找到中序序列中的这个点,以此分界,左为左子树的中序序列,右为右子树的中序序列
③在前序中,刨除第一个根节点,剩下也按此分开,左为左子树的前序序列
④递归
结果:
已知后序和中序也可以
已知前序和后序不唯一:当一个根只有一颗子树时,通过前序遍历和后序遍历,无法确定该子树是这个根的左子树还是右子树