• 剑指offer T4 重建二叉树


     二叉树的三种遍历:

    前序:根节点 --> 左子树 --> 右子树

    中序:左子树 --> 根节点 --> 右子树

    后序:左子树 --> 右子树 --> 根节点

    在前序遍历序列中,从左到右依次取一个数,并找到其在中序遍历中的位置,左边为左子树,右边则是右子树

     按照这种思路,编写代码如下:

     1 TreeNode* helper(vector<int> pre, vector<int> vin, int& k, int l, int r)  
    //k表示当前是前序序列中的元素的下标,l,r表示当前中序序列中的左子树或者右子树的边界
    2 { 3 if (k == pre.size()) 4 return nullptr; 5 if (l == r) 6 return new TreeNode(vin[l]); 7 int i = l; 8 for (; i <= r; i++)  //找到根节点的位置 9 { 10 if (vin[i] == pre[k]) 11 break; 12 } 13 TreeNode* root = new TreeNode(pre[k]); 14 15 if (i > l) 16 root->left = helper(pre, vin, ++k, l, i - 1);  //进入左子树递归 17 if (i < r) 18 root->right = helper(pre, vin, ++k, i + 1, r); 19 20 return root; 21 22 } 23 24 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { 25 if (vin.size() != pre.size() || pre.size() == 0) 26 return nullptr; 27 int k = 0; 28 TreeNode* head = helper(pre, vin, k, 0, vin.size() - 1); 29 return head; 30 }

    .

     这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线   这里是分界线 

    类似的一道题

     前序遍历是从左往右依次是根节点,左子树,右子树;而后序遍历是从右往左依次是根节点,右子树,左子树。

    所以上述代码只要稍作修改就行了。

     1 TreeNode* helper(vector<int>& post, vector<int>& vin, int& k, int l, int r)
     2     {
     3         if (k < 0 )
     4             return nullptr;
     5         if (l == r)
     6             return new TreeNode(vin[l]);
     7         int i = r;
     8         for (; i >= l; i--)
     9         {
    10             if (vin[i] == post[k]) 
    11                 break;
    12         }
    13         TreeNode* root = new TreeNode(post[k]);
    14 
    15         if (i < r)
    16             root->right = helper(post, vin, --k, i + 1, r);
    17         if (i > l)
    18             root->left = helper(post, vin, --k, l, i - 1);
    19 
    20         return root;
    21 
    22     }
    23     
    24     TreeNode* reConstructBinaryTree(vector<int>& in, vector<int>& post)
    25     {
    26         if (in.size() != post.size() || post.size() == 0)
    27             return nullptr;
    28         int k = post.size()-1;
    29         TreeNode* head = helper(post, in, k, 0, in.size() - 1);
    30         return head;
    31     }

  • 相关阅读:
    SourceForge上发布dedup util 收藏
    IBM快速整合Diligent 触动了谁的神经?
    Data Domain揭开其神秘面纱 加速中国业务发展
    Java NIO原理和使用
    用PDB库调试Python程序
    windows下配置eclipse + Python + PyDev + tornado,并使用pylint进行静态检测
    函数fork与vfork的区别与联系详解
    关于C++中友元类和友元函数的示例讲解
    const成员函数
    pthread_cond_wait()深入解析
  • 原文地址:https://www.cnblogs.com/jiguang321/p/11578173.html
Copyright © 2020-2023  润新知