zoukankan      html  css  js  c++  java
  • [LeetCode_105]Construct Binary Tree from Preorder and Inorder Traversal

    题目链接

    https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

    题意

    由二叉树的先序遍历和中序遍历建树

    思路

    理解建树过程;使用递归,递归关键:清楚递归过程,明确函数参数、返回值,写终止条件。
    此外,注意空树的特判。

    其他点

    1 熟悉find()、assign()的使用。
    2 使用

    struct TreeNode *pNode =new TreeNode(*preRootIter);
    

    而不是

    struct TreeNode node=TreeNode(*preRootIter);
    struct TreeNode* pNode=node;
    

    否则造成assign的时候树中某些节点值被改变。

    todo

    上述问题原因待查。
    应该最后要遍历树释放内存吧。

    代码

    #include <vector>
    #include <iostream>
    using namespace std;
    
     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) {
            if(!preorder.size()){
                return NULL;
            }
            else{
                struct TreeNode* root=buildT(preorder,inorder);
                return root;
            }
        }
        
    private:
        TreeNode* buildT(vector<int> preorder,vector<int> inorder){
            vector<int>::iterator preRootIter=preorder.begin();
            vector<int>::iterator midRootIter=find(inorder.begin(), inorder.end(), *preRootIter);
            //create a new node
            struct TreeNode *pNode =new TreeNode(*preRootIter);
    //        struct TreeNode node=TreeNode(*preRootIter);
    //        struct TreeNode* pNode=node;
            
            //left child tree
            vector<int>::size_type leftLen=midRootIter-inorder.begin();
            vector<int>::iterator lPreBeg=preRootIter+1;
            vector<int>::iterator lPreEnd=lPreBeg+leftLen;
            if(!leftLen){
                pNode->left=NULL;
            }
            else{
                vector<int> preorderLeft;
                preorderLeft.assign(lPreBeg, lPreEnd);
                
                vector<int> inorderLeft;
                inorderLeft.assign(inorder.begin(), midRootIter);
                pNode->left=buildT(preorderLeft, inorderLeft);
            }
            
            //right child tree
            vector<int>::size_type rightLen=inorder.end()-(midRootIter+1);
            if(!rightLen){
                pNode->right=NULL;
            }
            else{
                vector<int> preorderRight;
                vector<int>::iterator rPreBeg=lPreEnd;
                vector<int>::iterator rPreEnd=rPreBeg+rightLen;
                preorderRight.assign(rPreBeg, rPreEnd);
                
                vector<int> inorderRight;
                inorderRight.assign(midRootIter+1, inorder.end());
                pNode->right=buildT(preorderRight, inorderRight);
            }
    
            return pNode;
        }
    };
    
    int main(){
        Solution solution;
        vector<int> preorder={3,9,20,15,7};
        vector<int> inorder={9,3,15,20,7};
        struct TreeNode* tree=solution.buildTree(preorder,inorder);
        return 0;
    }
    
  • 相关阅读:
    asp.net 启动关闭iis
    vue 界面关闭触发事件 ---实例销毁之前调用
    ElmentUI 设置禁止点击遮罩关闭 el-dialog 弹窗
    C#反射
    SQL Server 创建游标(cursor)
    文件解压缩
    文件流操作
    Linq查询
    C#线程 多线程 进程
    匿名类型和反射
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10302939.html
Copyright © 2011-2022 走看看