LeetCode 106 从中序与后序遍历序列构造二叉树

题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

思路:

中序和后序遍历构建二叉树,最终将构建的二叉树层序输出

1.如果数组大小为零,说明是空节点了
2.如果不为空,那么去后序数组中的最后一个结点作为树的根结点
3.找切割点
4. 切割中序数组,找出左中序和右中序数组
5. 切割后序数组,找出左后序和右后序数组
6. 继续递归遍历(左中序,左后序)(右中序,右后序)

struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x):val(x),left(NULL),right(NULL){}
};

class Solution {
public:
	TreeNode* Centerder(vector<int>& inorder,vector<int>& postorder) {
		//1.如果数组大小为零,说明是空节点了
		if (postorder.size() == 0)return NULL;
		//2.如果不为空,那么去后序数组中的最后一个结点作为树的根结点
		int rootValue = postorder[postorder.size() - 1];
		TreeNode* root = new TreeNode(rootValue);
		
		if (postorder.size() == 1) return root;
		//3.找切割点
		int index = 0;
		for (index = 0; index < inorder.size();index++) {
			if (inorder[index] == rootValue) {
				break;
			}
		}
		//4. 切割中序数组 
		vector<int> leftInorder(inorder.begin(),inorder.begin()+index);
		vector<int> rightInorder(inorder.begin()+index+1,inorder.end());

		// postorder 舍弃末尾元素
		postorder.resize(postorder.size() - 1);

		//5. 切割后序数组
	
		vector<int> leftpostorder(postorder.begin(),postorder.begin()+leftInorder.size());
		vector<int> rightpostorder(postorder.begin() + leftInorder.size(),postorder.end());

		//6 继续递归
		root->left = Centerder(leftInorder,leftpostorder);
		root->right = Centerder(rightInorder, rightpostorder);
		return root;
	}
	vector<int> test(TreeNode* root) {
		queue<TreeNode*> que;
		if (root != NULL) {
			que.push(root);
		}
		vector<int> result;
		while (!que.empty()) {
			int size = que.size();
			for (int i = 0; i < size; i++) {
				TreeNode* node = que.front();
				result.push_back(node->val);
				que.pop();
				if (node->left)que.push(node->left);
				if (node->right)que.push(node->right);
			}
		}
		return result;
	}
};


int main() {
	vector<int> inorder = { 9,3,15,20,7 };//中
	vector<int> postorder = { 9,15,7,20,3 };//后
	Solution ss;
	TreeNode* root = ss.Centerder(inorder, postorder);
	vector<int> vec = ss.test(root);
	for (vector<int>::iterator it = vec.begin(); it != vec.end();it++) {
		cout << *it << " ";
	}
	cout << endl;
	return 0;
}

你可能感兴趣的:(leetcode,算法,数据结构)