重建二叉树 (C++牛客网)

解题思路:

(1)前序序列中的第一个肯定为根结点,此时在中序序列中找到这个根结点的位置,设为pos

(2)如果一棵树的左(右)子树存在,那么它在前序序列和中序序列中的长度是一样的

(3)那么就可以将根结点的左右子树的前序序列和中序序列提取出来,递归构造

(4)详情请见代码

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) {
    	//新建节点
		TreeNode *root = new TreeNode(pre[0]);  
		//在中序序列中找到根节点的位置  
		int pos = find(vin.begin(),vin.end(),pre[0])-vin.begin(); 
		
		if (pos!=0) { //存在左子树 
			vector<int> lpre(pre.begin()+1,pre.begin()+pos+1);
			vector<int> lvin(vin.begin(),vin.begin()+pos);
			root->left = reConstructBinaryTree(lpre,lvin);
		} 
		if (pos!=pre.size()-1) { //存在右子树 
			vector<int> rpre(pre.begin()+pos+1,pre.end());
			vector<int> rvin(vin.begin()+pos+1,vin.end());
			root->right = reConstructBinaryTree(rpre,rvin);
		}
		return root;
		 
    }
};
发布了302 篇原创文章 · 获赞 277 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/coolsunxu/article/details/105573048
今日推荐