面试题:重建二叉树(中序&前序) &&(中序&后序)

1,中序和后序重建二叉树 

中心思想:

从前序遍历中顺序依次拿出一个值,这个值肯定是根,并找出这个值在中序数组的下标,将中序数组划分为左右两份,分别递归。

注意:遍历前序数组需要传索引的指针,因为每次递归的索引都不一样

//重建二叉树

#include<vector>
 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 (0 == pre.size() || 0 == vin.size())
			return NULL;
		int index = 0;   

index为前序遍历的索引,会贯穿整个递归过程,所以用传指针的方式,保证不会因为进入 新的函数而错乱,之前用static定义,但是不能AC

		TreeNode*tmp = _reConstructBinaryTree(pre, vin, 0, pre.size() - 1, &index);
		return tmp;
	}

	TreeNode* _reConstructBinaryTree(vector<int> pre, vector<int>vin, int left, int right,int * index)
	{
		//递归的出口
		if (left > right)
			return NULL;
		//在前序遍历中找本次递归要创建的节点
		
		int i = 0;
		while (pre[*index] != vin[i])
		{
			i++;
		}
		(*index)++;//为下次寻找做准备
		TreeNode* newHead = new TreeNode(vin[i]);
		newHead->left = _reConstructBinaryTree(pre, vin, left, i - 1, index);
		newHead->right = _reConstructBinaryTree(pre, vin, i + 1, right,index);
		return  newHead;


	}
};

int main()
{
	Solution s;
	vector<int> pre = { 1, 2, 4, 7, 3, 5, 6, 8 };
	vector<int> vin = { 4, 7, 2, 1, 5, 3, 8, 6 };

	s.reConstructBinaryTree(pre,vin);

	return 0;
}

2,根据中序和后序数组重建二叉树

中心思想:和根据前序中序重建二叉树差不多,不同点是,遍历后序数组要从后开始遍历,并且要先创建右子树,这样才能使得后序的下个索引在 i+1 和 right 的范围内,若先创建左子树,那么找到的下标不在 left 到 i-1的范围内

#include<vector>
 struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
	
};

class Solution {
public:
	TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
		if (inorder.size() == 0 || postorder.size() == 0)
			return	NULL;
		int index = postorder.size()-1;
		TreeNode*tmp=_buildTree(inorder, postorder, 0, inorder.size() - 1, &index);
		return tmp;
	}
	TreeNode* _buildTree(vector<int> &inorder, vector<int> &postorder,int left, int right,int* index)
	{
		if (left > right)
			return NULL;
		//在中序遍历中找后序遍历下标为*index的值
		int i = 0;
		while (inorder[i] != postorder[*index])
		{
			i++;
		}
		(*index)--;
		TreeNode* root = new TreeNode(inorder[i]);
		
		root->right = _buildTree(inorder, postorder, i + 1, right, index);
		root->left = _buildTree(inorder, postorder, left, i - 1, index);
		return root;
	}


};

猜你喜欢

转载自blog.csdn.net/wm12345645/article/details/81636879