zoukankan      html  css  js  c++  java
  • 【LeetCode】105 & 106 Construct Binary Tree from (Preorder and Inorder) || (Inorder and Postorder)Traversal

    Description:

        Given arrays recording 'Preorder and Inorder' Traversal (Problem 105) or  'Inorder and Postorder' (Problem 106), u need build the binary tree.

    Input:

        105. Preorder & Inorder traversal

        106. Inorder & Postorder traversal

    output:

        A binary tree.

    Solution:

      This solution uses the algorithm "divide and conquer". Taking an example of 105, we can get the root node from preorder travelsal then use inorder traversal to divide the range of left tree nodes and the right tree nodes. You can

    draw some simple instances on paper,  which will make you totally clear about the thinking. 

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    //105
    class Solution {
    public:
        void travel(TreeNode **root)
        {
            if(*root){
                travel(& ((*root) -> left));
                cout<<"val is "<<(*root)->val<<endl;
                travel(& ((*root) -> right));
            }
        }
    
        TreeNode* createTree(vector<int>& preorder, vector<int>& inorder, int preSta, int preEnd, int inSta, int inEnd)
        {
            if(preSta > preEnd || inSta > inEnd ) return NULL;
            TreeNode *root = new TreeNode(preorder[preSta]);
            int index;
            for(int i = inSta; i <= inEnd; i ++){
                if(inorder[i] == preorder[preSta]){
                    index = i;
                    break;
                }
            }
            root -> left = createTree(preorder, inorder, preSta + 1, preSta + index - inSta, inSta, index - 1);
            root -> right = createTree(preorder, inorder, preSta + index - inSta + 1, preEnd, index + 1, inEnd);
            return root;
        }
    
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            TreeNode *root = createTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
            TreeNode **r = &root;
            //travel(r);
            return root;
        }
    };
    
    //106.
    class Solution {
    public:
        TreeNode* createTree(vector<int>& inorder, vector<int>& postorder, int inSta, int inEnd, int postSta, int postEnd){
            if(inSta > inEnd || postSta > postEnd)
                return NULL;
            TreeNode* root = new TreeNode(postorder[postEnd]);
            int index;
            for(int i = inEnd; i >= inSta; i --){
                if(postorder[postEnd] == inorder[i]){
                    index = i;
                    break;
                }
            }
            root -> right = createTree(inorder, postorder, index + 1, inEnd, postEnd - (inEnd - index), postEnd - 1);
            root -> left = createTree(inorder, postorder, inSta, index - 1, postSta, postSta + (index - inSta - 1));
            return root;
        }
        TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
            TreeNode* root = createTree(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
            return root;
        }
    };
  • 相关阅读:
    几个Tab,滑动门,选项卡,图片切换
    超多的CSS3圆角渐变网页按钮
    B2B(企业对企业)、B2C(企业对个人)、C2C(个人对个人)
    如何获取一个数据库的所有建表语句与创建索引的语句?
    Linux学习笔记(7)CRT实现windows与linux的文件上传下载
    (4.17)sql server中的uuid获取与使用
    【等待优化】SQL SERVER常见等待——解决会话等待产生的系统问题
    sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)
    always on 之路实践(未完)
    (4.16)存储过程的加密与解密
  • 原文地址:https://www.cnblogs.com/luntai/p/5655571.html
Copyright © 2011-2022 走看看