牛客網 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;
    }
};

在這裏插入圖片描述

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