目录

​1,题目描述​

​英文描述​

​中文描述​

​2,解题思路​

​主要思想:​

​相关题目:​

​3,AC代码​

​4,解题过程​


1,题目描述

英文描述

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

中文描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

2,解题思路

主要思想:

需要掌握先序遍历与中序遍历构建树的特点:

  • 先序遍历,第一个节点必为根节点;
  • 中序遍历根节点两端为左子树和右子树,所以有了中序遍历的左右界限+根节点位置,即可得到左右子树节点数目;

先序遍历确定根节点位置,中序遍历确定左右子树节点数目。然后就可以继续往下递归构建子树;

关键代码如下:

// root:先序遍历根节点的位置 // left right:中序遍历树的左右界限 // TreeNode*& T:当前根节点 void creatTree(int root, int left, int right, TreeNode*& T){ // !!! *&才能改变树的值 if(left > right) return; // 出口条件 T = new TreeNode(pre[root]); // 实例化根节点(赋值) int i = left; while(i <= right && in[i] != pre[root]) i++; // 寻找根节点在中序遍历中的位置 进而确定左右子树节点数目 creatTree(root + 1, left, i - 1, T->left); // 重新定义先序遍历的根节点 中序遍历的左右界限 递归构建左子树 creatTree(root + i - left + 1, i + 1, right, T->right); // 递归构建右子树 }

相关题目:

难度不分前后,上榜各凭本事

​@&再见萤火虫&【PAT_甲级_1020 Tree Traversals (25分) (C++)【树的遍历】】​

​@&再见萤火虫&【PAT_甲级_1064 Complete Binary Search Tree (30分) (C++)【完全二叉搜索树/层次遍历】】​

​@&再见萤火虫&【PAT_甲级_1086 Tree Traversals Again (25point(s)) (C++)【树的遍历/先序+中序=后序】】​

​@&再见萤火虫&【**PAT_甲级_1119 Pre- and Post-order Traversals (30point(s)) (C++)【二叉树的遍历】】​

​@&再见萤火虫&【PAT_甲级_1138 Postorder Traversal (25point(s)) (C++)【树的遍历/先序+中序->后序】】​

 

3,AC代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> pre, in;
TreeNode* tree = NULL;
void creatTree(int root, int left, int right, TreeNode*& T){ // !!! *&
if(left > right) return;
T = new TreeNode(pre[root]);
int i = left;
while(i <= right && in[i] != pre[root]) i++; // !!! i <= right
creatTree(root + 1, left, i - 1, T->left);
creatTree(root + i - left + 1, i + 1, right, T->right);
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
pre = preorder; in = inorder;
creatTree(0, 0, inorder.size() - 1, tree); // !!! inorder.size() - 1
return tree;
}
};

 

4,解题过程

由于PAT里面关于此类型的题目做的比较多,所以没有耽误太长时间,一发入魂;

LeetCode_Array_105. Construct Binary Tree from Preorder and Inorder Traversal先序+中序构建二叉树(C++)【构建二叉树】_C++