当前位置:   article > 正文

(LeetCode C++)从前序与中序遍历序列构造二叉树_preorder c++ 前序遍历 数组模拟

preorder c++ 前序遍历 数组模拟

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

  1. 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  2. 输出: [3,9,20,null,null,15,7]

示例 2:

  1. 输入: preorder = [-1], inorder = [-1]
  2. 输出: [-1]

提示:

  1. 1 <= preorder.length <= 3000
  2. inorder.length == preorder.length
  3. -3000 <= preorder[i], inorder[i] <= 3000
  4. preorder 和 inorder 均 无重复 元素
  5. inorder 均出现在 preorder
  6. preorder 保证 为二叉树的前序遍历序列
  7. inorder 保证 为二叉树的中序遍历序列

首先,二叉树的实现是:

  1. // Definition for a binary tree node
  2. class TreeNode
  3. {
  4. public:
  5. int val;
  6. TreeNode *left;
  7. TreeNode *right;
  8. TreeNode()
  9. {
  10. this->val=0;
  11. this->left=nullptr;
  12. this->right=nullptr;
  13. }
  14. TreeNode(int x)
  15. {
  16. this->val=x;
  17. this->left=nullptr;
  18. this->right=nullptr;
  19. }
  20. TreeNode(int x,TreeNode *left,TreeNode *right)
  21. {
  22. this->val=x;
  23. this->left=left;
  24. this->right=right;
  25. }
  26. };

Method:

  1. 前序遍历的第一个节点,是树的根节点。
  2. 在中序遍历中,根节点的左边均是左子树,右边均是右子树。

因此按照以上的规则进行递归即可。

Code 0:

  1. class Solution{
  2. public:
  3. // 递归构造二叉树
  4. TreeNode *sub_buildTree(vector<int> &preorder,int start_pre,int end_pre,vector<int> &inorder,int start_in,int end_in){
  5. // 如果前序遍历开始指针在前序遍历结束指针之后
  6. if(start_pre>end_pre){
  7. // 返回null
  8. // 即为到达了叶节点
  9. return nullptr;
  10. }
  11. // 创建一个新节点
  12. TreeNode *root=new TreeNode(preorder[start_pre]);
  13. // 记录先序遍历的第一个节点再中序遍历数组中的位置
  14. int root_index=start_in;
  15. // 遍历中序遍历数组
  16. for(;root_index<=end_in;root_index++){
  17. // 寻找根节点的位置
  18. if(inorder[root_index]==root->val){
  19. // 找到后即结束遍历
  20. break;
  21. }
  22. }
  23. // 递归遍历左子树
  24. root->left= sub_buildTree(preorder,start_pre+1,start_pre+root_index-start_in,inorder,start_in,root_index-1);
  25. // 递归遍历右子树
  26. root->right= sub_buildTree(preorder,start_pre+root_index-start_in+1,end_pre,inorder,root_index+1,end_in);
  27. // 返回该节点
  28. return root;
  29. }
  30. // 从前序与中序遍历序列构造二叉树
  31. TreeNode *buildTree(vector<int> &preorder,vector<int> &inorder){
  32. // 记录二叉树的节点个数
  33. int n=preorder.size();
  34. // 递归构造二叉树
  35. return sub_buildTree(preorder,0,n-1,inorder,0,n-1);
  36. }
  37. };

Code 1:

  1. class Solution{
  2. public:
  3. unordered_map<int,int> indexMap;
  4. // 递归构造二叉树
  5. TreeNode *sub_buildTree(vector<int> &preorder,int start_pre,int end_pre,vector<int> &inorder,int start_in,int end_in){
  6. // 如果前序遍历开始指针在前序遍历结束指针之后
  7. if(start_pre>end_pre){
  8. // 返回null
  9. // 即为到达了叶节点
  10. return nullptr;
  11. }
  12. // 创建一个新节点
  13. TreeNode *root=new TreeNode(preorder[start_pre]);
  14. // 记录先序遍历的第一个节点在中序遍历数组中的位置
  15. int root_index=indexMap[preorder[start_pre]];
  16. // 递归遍历左子树
  17. root->left= sub_buildTree(preorder,start_pre+1,start_pre+root_index-start_in,inorder,start_in,root_index-1);
  18. // 递归遍历右子树
  19. root->right= sub_buildTree(preorder,start_pre+root_index-start_in+1,end_pre,inorder,root_index+1,end_in);
  20. // 返回该节点
  21. return root;
  22. }
  23. // 从前序与中序遍历序列构造二叉树
  24. TreeNode *buildTree(vector<int> &preorder,vector<int> &inorder){
  25. // 记录二叉树的节点个数
  26. int n=preorder.size();
  27. // 利用unordered map记录中序遍历中每一个节点的index
  28. for(int i=0;i<n;i++){
  29. indexMap[inorder[i]]=i;
  30. }
  31. // 递归构造二叉树
  32. return sub_buildTree(preorder,0,n-1,inorder,0,n-1);
  33. }
  34. };

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/222253
推荐阅读
相关标签
  

闽ICP备14008679号