106. 从中序与后序遍历序列构造二叉树
?做题思路or感想:
-
这道题要从前中后序遍历的特点入手。因为后序遍历的最后一个节点必是根节点,故从次开始
- 如果数组长度为0,则说明是空节点
- 如果数组不为空,那么后序数组的最后一个元素作为节点元素
- 找到后序数组的最后一个元素在中序数组中的位置,作为切割位置
- 利用切割位置把中,后序数组切成左子树的中,后序数组和右子树的中,后序数组
- 递归左子树和右子树
-
class Solution { public: TreeNode* buildTree(vector
& inorder, vector & postorder) { if (postorder.size() == 0)return nullptr; int val = postorder[postorder.size() - 1]; TreeNode* root = new TreeNode(val); //造节点 if (postorder.size() == 1)return root; int index; //找切割点 for (int i = 0; i < inorder.size(); i++) { if (inorder[i] == val) { index = i; break; } } //左子树的中序,后序遍历的数组 vector inleft = vector (inorder.begin(), inorder.begin() + index); vector postleft = vector (postorder.begin(), postorder.begin() + index); //右子树的中序,后序遍历的数组 vector inright = vector (inorder.begin() + index + 1, inorder.end()); vector postright = vector (postorder.begin() + index, postorder.end() - 1); root->left = buildTree(inleft, postleft); root->right = buildTree(inright, postright); return root; } };