牛客网 c++ 剑指Offer_编程题 第四题重建二叉树

前言:

牛客网 c++ 剑指Offer_编程题 第四题重建二叉树

题目:

在这里插入图片描述
这个题要比前3题要难点了,解题思路根据先序和中序的特性 先找根节点 找左子树和右子树,递归找

先序的第一个 肯定是根节点,那么去中序里找根节点的位置,前面的都是左子树,后面的就是右子树

对二叉树3种遍历序列不清楚的可以看我这篇

在这里插入图片描述

code:

/**
 * 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 || pre.size() == 0)
		return nullptr;

	//先序的头肯定是根节点
	TreeNode* root=new TreeNode(pre[0]);

	//找左子树和右子树
	vector<int> preLeft_;
	vector<int> preRight_;

	vector<int> vinLeft_;
	vector<int> vinRight_;

	//root 在中序的位置
	int rootInIndex = -1;


	for (auto i = 0; i < vin.size(); i++)

	{
		if (vin[i] == root->val)
			rootInIndex = i;
	}
		

	//中序中 root前面的都是左子树
	for (auto i = 0; i < rootInIndex; i++)
	{
		vinLeft_.push_back(vin.at(i));
		//pre 第一个是根节点
		preLeft_.push_back(pre.at(i + 1));
	}

	for(auto i = rootInIndex+1;i<vin.size();i++)
	{

		vinRight_.push_back(vin.at(i));
		preRight_.push_back(pre.at(i));
	}



	root->left = reConstructBinaryTree(preLeft_, vinLeft_);
	root->right = reConstructBinaryTree(preRight_, vinRight_);

	
	return root;
    }
};

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章