zoukankan      html  css  js  c++  java
  • Lintcode---前序遍历和中序遍历树构造二叉树

    根据前序遍历和中序遍历树构造二叉树.

     注意事项

    你可以假设树中不存在相同数值的节点

    样例

    给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:

      2
     / 
    1   3


    思路:若前序遍历为空或者中序遍历为空则返回空;

             
    创建根节点,前序遍历第一个节点是个根节点,在中序遍历中找到根节点相应的位置,
    可以分别得到左子树和右子树的前序和中序遍历。重建左右子树;
             
              使用辅助空间,存放被分割开的前序和中序遍历的序列。

    /**
     * Definition of TreeNode:
     * class TreeNode {
     * public:
     *     int val;
     *     TreeNode *left, *right;
     *     TreeNode(int val) {
     *         this->val = val;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
     
    
    class Solution {
        /**
         *@param preorder : A list of integers that preorder traversal of a tree
         *@param inorder : A list of integers that inorder traversal of a tree
         *@return : Root of a tree
         */
         
        /*
        思路:若前序遍历为空或者中序遍历为空则返回空;
              创建根节点,前序遍历第一个节点是个根节点,在中序遍历中找到根节点相应的位置,
              可以分别得到左子树和右子树的前序和中序遍历。重建左右子树;
              
              使用辅助空间,存放被分割开的前序和中序遍历的序列。
        */
    
    public:
        TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
            // write your code here
            
            if(preorder.size()==0||inorder.size()==0){
                return NULL;
            }
            
            if(preorder.size()!=inorder.size()){
                return NULL;
            }
            
            vector<int> preorder_l,preorder_r,inorder_l,inorder_r;
            int root_index=-1;
            int len=inorder.size();
            
            
            TreeNode* root=new TreeNode(preorder[0]);
            
            
            //  在中序队列中找出根节点位置
            for(int i=0;i<len;i++){
                if(preorder[0]==inorder[i]){
                    root_index=i;
                    break;
                }
            }
            
            //  左右子树的前序、中序队列
            for(int i=0; i<root_index; i++) {
                preorder_l.push_back(preorder[i+1]);
                inorder_l.push_back(inorder[i]);
            }
            
            for(int i=root_index+1; i<inorder.size(); i++) {
                preorder_r.push_back(preorder[i]);
                inorder_r.push_back(inorder[i]);
            }
    
            
            root->left=buildTree(preorder_l, inorder_l);
            root->right = buildTree(preorder_r, inorder_r);
            
            return root;
        }
    };
    
     
  • 相关阅读:
    [转]唐骏谈职场 —— 管理者要学会让员工感动
    [转]网站访问量剧增时解决方案
    vbscript:MsgBox参数说明
    验证输入内容是否为数字的简单方法
    页面加载自动跳转页面
    "未能写入输出文件“c:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary AS"的解决办法
    BIND9源码分析奠基
    Trie树详解
    cuckoo hash
    BIND9源码分析之定时器timer
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7095012.html
Copyright © 2011-2022 走看看