目录
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代码
4,解题过程
由于PAT里面关于此类型的题目做的比较多,所以没有耽误太长时间,一发入魂;