• (树)根据中序后序构建二叉树


    • 题目:根据中序和后序遍历构建二叉树
    • 思路:利用递归加上分治的思想。先找到根节点的值,然后在根据中序遍历找到根节点的左右两边的值,然后在递归的处理左右两边的左右子树。这里的关键在于怎么处理递归的左右子树的范围,代码里面详细解释
    • 代码:
      class Solution {
      public:
          TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
              vector<int>::size_type lenIn = inorder.size();
              vector<int>::size_type lenPost = postorder.size();
              return buildTree_Aux(inorder,0,lenIn-1,postorder,0,lenPost-1);
          }
           
          TreeNode *buildTree_Aux(vector<int> &inorder,int inB,int inE,
                                  vector<int> &postorder,int poB,int poE) {
              if(inB > inE || poB > poE)
                  return NULL;
              //在后序遍历中确定根节点
              TreeNode* root = new TreeNode(postorder[poE]);
              //在中序遍历中确定左右子树
              vector<int>::iterator iter = find(inorder.begin()+inB,inorder.begin()+inE,postorder[poE]);
              int index = iter - inorder.begin();//根节点的位置
      root
      ->left = buildTree_Aux(inorder,inB,index-1,postorder,poB,poB+index-1-inB);
         //这里postorder,poB,poB+index-1-inB这部分表示后序的左子树。pob是开始位置,index-1-inB是后序左子树的节点数的个数。poB+index-1-inB是后序的左子树的尾部 root
      ->right = buildTree_Aux(inorder,index+1,inE,postorder,poB+index-inB,poE-1);
         //这里postorder,poB+index-inB,poE-1这部分表示后序的右子树。poB+index-inB右子树开始位置,poE-1右子树结束位置,去掉了根节点的值(最尾部)
      return root; } };
    • 题目:根据前序和中序遍历构建二叉树
    • 思路:类似
    • 代码:
      /**
       * Definition for binary tree
       * struct TreeNode {
       *     int val;
       *     TreeNode *left;
       *     TreeNode *right;
       *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
       * };
       */
      class Solution {
      public:
          TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
              vector<int>::size_type lenIn = inorder.size();
              vector<int>::size_type lenPre = preorder.size();
              return buildTree_Aux(preorder, 0, lenPre-1, inorder, 0, lenIn-1);
          }
           TreeNode *buildTree_Aux(vector<int> &preorder,int prb,int pre,
                                   vector<int> &inorder,int inb,int ine) {
               if (prb > pre || inb > ine)
                   return NULL;
               TreeNode *root = new TreeNode(preorder[prb]);
               vector<int>::iterator iter = find(inorder.begin()+inb,inorder.begin()+ine,preorder[pre]);
               int mid = iter - inorder.begin();
               root->left = buildTree_Aux(preorder, prb+1, prb+mid-inb, inorder, inb, mid-1);
               root->right = buildTree_Aux(preorder, prb+1+mid-inb, pre, inorder, mid+1, ine);
               return root;
           }
      };
  • 相关阅读:
    数组返回NULL绕过
    69.x的平方根
    1277.统计全为1的正方形子矩形
    221.最大正方形
    572.另一个树的子树
    983.最低票价
    98.验证二叉排序树
    53.最大子序和
    5386.检查一个字符串是否可以打破另一个字符串
    5385.改变一个整数能得到的最大差值
  • 原文地址:https://www.cnblogs.com/Kobe10/p/6363455.html
Copyright © 2020-2023  润新知