zoukankan      html  css  js  c++  java
  • leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)

    题目:

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

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

    说明:

          1)二叉树可空

          2)思路:a、根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中序序列(InSequence)中查找此根(root), 

                       b、根据中序遍历特点, 知在查找到的根(root) 前边的序列为根的左子树的中序遍历序列,  后边的序列为根的右子树的中序遍历序列。

                       c、设在中序遍历序列(InSequence)根前边有left个元素. 则在前序序列(PreSequence)中, 紧跟着根(root)的left个元素序列(即PreSequence[1...left]) 为根的            左子树的前序遍历序列, 在后边的为根的右子树的前序遍历序列.而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为PreSequence[1...left]), 中序序列            为InSequence[0...left-1], 分别为原序列的子串, 构造右子树同样, 显然可以用递归方法解决。

    实现:

    实现一:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    13        TreeNode *root=NULL;
    14        creatTree(&root,preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
    15        return root;
    16     }
    17 private:
    18      //双指针(TreeNode **t)实现构建二叉树
    19     void creatTree(TreeNode **t,vector<int>::iterator pre_beg,vector<int>::iterator pre_end,vector<int>::iterator in_beg,vector<int>::iterator in_end)
    20     {
    21       if(pre_beg==pre_end) //空树
    22       {
    23          (*t)=NULL;
    24          return;         
    25       }
    26       (*t)=new TreeNode(*pre_beg);
    27       vector<int>::iterator inRootPos=find(in_beg,in_end,(*t)->val);//中序遍历中找到根节点,返回迭代指针
    28        int leftlen=distance(in_beg,inRootPos);//中序遍历起点指针与找到的根节点指针的距离
    29       creatTree(&((*t)->left),next(pre_beg),next(pre_beg,leftlen+1),in_beg,inRootPos);//递归构建左子数
    30       creatTree(&((*t)->right),next(pre_beg,leftlen+1),pre_end,next(inRootPos),in_end);//递归构建右子树
    31     }
    32 };

    实现二:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    13        TreeNode *root=NULL;
    14        creatTree(root,preorder.begin(),preorder.end(),inorder.begin(),inorder.end());
    15        return root;
    16     }
    17 private:
    18      //指针引用(TreeNode *&t)实现构建二叉树
    19     void creatTree(TreeNode *&t,vector<int>::iterator pre_beg,vector<int>::iterator pre_end,vector<int>::iterator in_beg,vector<int>::iterator in_end)
    20     {
    21       if(pre_beg==pre_end) //空树
    22       {
    23          t=NULL;
    24          return;         
    25       }
    26       t=new TreeNode(*pre_beg);
    27       vector<int>::iterator result=find(in_beg,in_end,t->val);//中序遍历中找到根节点,返回迭代指针
    28        int len=distance(in_beg,result);//中序遍历起点指针与找到的根节点指针的距离
    29       creatTree(t->left,pre_beg+1,pre_beg+len+1,in_beg,result);//递归构建左子数
    30       creatTree(t->right,pre_beg+len+1,pre_end,result+1,in_end);//递归构建右子树
    31     }
    32 };
  • 相关阅读:
    Mysql优化之Explain查询计划查看
    map转listmap
    代码大全
    cas
    日志
    xml模板
    springboot
    日志
    spring应用
    拆分表中sheet
  • 原文地址:https://www.cnblogs.com/zhoutaotao/p/3833270.html
Copyright © 2011-2022 走看看