1. 程式人生 > >【面試題】根據前序遍歷和中序或中序和後序遍歷樹構造二叉樹

【面試題】根據前序遍歷和中序或中序和後序遍歷樹構造二叉樹

class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
     int len = vin.size();
        if(len == 0){
            return NULL;
        }
        vector<int> left_pre, right_pre;
        vector<int> left_in, right_in;
        TreeNode *root = new
TreeNode(pre[0]); int index =-1; for(int i=0; i<len; i++){ if(vin[i] == pre[0]){ index = i; break; } } for(int i=0; i<index; i++){ left_pre.push_back(pre[i+1]); left_in.push_back(vin[i]); } for
(int i=index+1; i<len; i++){ right_pre.push_back(pre[i]); right_in.push_back(vin[i]); } root->left = reConstructBinaryTree(left_pre, left_in); root->right = reConstructBinaryTree(right_pre, right_in); return root; } };

根據中序遍歷和後序遍歷樹構造二叉樹
解題思路
思路和用前序遍歷和後序遍歷樹構造二叉樹類似
1、首先根據後序遍歷序列的最後一個數字建立根結點(後序遍歷序列的最後一個數字就是根結點)
2、然後在中序遍歷序列中找到根結點所在的位置,這樣就能確定左、右子樹結點的數量,這樣也就分別找到了左、右子樹的中序遍歷序列和後序遍歷序列。
3、然後用遞迴的方法去構建左、右子樹,直到葉子結點。
根據中序加後序遍歷重建二叉樹

程式碼如下:

class Solution {
public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
        if(inorder.size()==0||postorder.size()==0)
            return NULL;
        if(inorder.size()!=postorder.size())
            return NULL;
        int root_index=-1;
        vector<int> inL,inR,postL,postR;
        int len=postorder.size();
        TreeNode *root=new TreeNode(postorder[len-1]);
        for(int i=0;i<len;i++)
        {
            if(postorder[len-1]==inorder[i])
            {
                root_index=i;
                break;
            }
        }

        for(int j=0;j<root_index;j++)
        {
            postL.push_back(postorder[j]);
            inL.push_back(inorder[j]);
        }
        int k=root_index+1;
        for(;k<inorder.size();k++)
        {
            postR.push_back(postorder[k-1]);
            inR.push_back(inorder[k]);
        }

        root->left=buildTree(inL,postL);
        root->right=buildTree(inR,postR);
        return root;
    }
};

相關推薦

試題根據構造

class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int len = vin.si

試題劍指offer10--求一個數的二進位制數的1的個數

求一個數二進位制數中的個數 第一種方法:模除法 程式碼如下: //Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的 //1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入

構造

fin traversal dtree 構造二叉樹 div integer break param val 根據前序遍歷和中序遍歷樹構造二叉樹 樣例: 給出中序遍歷:[1,2,3]和前序遍歷:[2,1,3]. 返回如下的樹: 2 / \ 1 3 我們知道前序遍歷

根據構造

eno build 中序遍歷樹 oot post rsa uil cnblogs 找到 根據中序遍歷和後序遍歷樹構造二叉樹 樣例: 給出樹的中序遍歷: [1,2,3] 和後序遍歷: [1,3,2] 返回如下的樹: 2 / \ 1 3 借鑒上一篇《前序遍歷和中序遍

lintcode- 構造-73

/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left,

72 構造

實的 dong scrip size turn -c -h red 左右子樹 原題網址:https://www.lintcode.com/problem/construct-binary-tree-from-inorder-and-postorder-traversal/d

LintCode(72)構造

題目  中序遍歷和後序遍歷樹構造二叉樹 根據中序遍歷和後序遍歷樹構造二叉樹 樣例 給出樹的中序遍歷: [1,2,3] 和後序遍歷: [1,3,2] 返回如下的樹:   2  /  

資料結構構造

根據一棵樹的前序遍歷與中序遍歷構造二叉樹 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNo

試題Python高級開發工程師試題

http ges log com .com blog mage 回復 image 線上面試題,有空整理答案,歡迎大家回復答案 【面試題】Python高級開發工程師面試題

試題LRU算法及編碼實現LRU策略緩存

max 防止 技術分享 nbsp pri value 概念 閾值 使用 概念   LRU(least recently used)就是將最近不被訪問的數據給淘汰掉,LRU基於一種假設:認為最近使用過的數據將來被使用的概率也大,最近沒有被訪問的數據將來被使用的概率比較低。

試題2018年最全Java面試通關秘籍第五套!

XA 中文分詞 coo div rop 為什麽 3.2 自旋 FQ 【面試題】2018年最全Java面試通關秘籍第五套! 原創 2018-04-26 徐劉根 Java後端技術 第一套:《2018年最全Java面試通關秘籍第一套!》 第二套:《2018年最全Java面試通

試題Java試題--基礎總結--個人學習記錄

1、Java執行緒的狀態 新建new:新建立一個執行緒物件。 就緒runnable:建立執行緒物件後呼叫start方法,此時執行緒進入可執行狀態,等待CPU的時間片,且其他所需資源已獲得。 執行running(一般不考慮這種狀態):執行緒分得CPU的時間片、資源後執行執行緒。 阻塞b

試題Java試題--技術框架--個人學習記錄

1、看過哪些開源框架的原始碼   2、為什麼要用Redis,Redis有哪些優缺點?Redis如何實現擴容?   3、Netty是如何使用執行緒池的,為什麼這麼使用   4、為什麼要使用Spring,Spring的優缺點有哪些 &

試題Java試題--技術深度--個人學習記錄

1、有沒有看過JDK原始碼,看過的類實現原理是什麼。 2、HTTP協議   TCP詳解 關於http協議 3、TCP協議   TCP詳解 關於http協議 4、一致性Hash演算法 5、JVM如何載入位元組碼檔案 loa

資料結構構造

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 具體程式碼如下: struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNod

試題Java 2個(多個)大整數相加如何實現

之前面試阿里的時候,第四面的時候面試官讓我當他面實現這個題目, 一開始的時候問的時候 2個相加如何實現,然後我寫完了之後又問我如果是多個相加呢?面試官希望我能在實現的時候能夠考慮到各種可能性,比如多個數相加,然後等我寫完了之後,又問我有沒有更好的實現方法;以下是我的實現方法; 將待相加

試題多執行緒在執行過程,某個執行緒執行時,突然釋放鎖。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

試題同學的

汽車之家 1、訪問修飾符有哪幾種?有什麼的區別? 2、面向物件三大特性?在開發中怎麼體現? 3、redis有哪些資料型別? 4、資料庫索引瞭解過嗎? 5、spring mvc 一個請求的處理過程是怎麼樣的? 6、List有那些型別,內部由什麼構成? 7、從上一家公司離職的原因是什麼? 8、什麼時候能入職? 汽

試題求連結串列的環入口點

環入口點:我們設A是連結串列的起點,B是環的入口點,C是環內快慢指標的相遇點。兩個快慢指標定義為slow和fast. slow走的路程:A->B->C; fast走的路程:A->B->C->B->C; 2*(x+y)=x+y+z+y 

LeetCode105. 從前序列構造 結題報告 (C++)

題目描述: 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重複的元素。 例如,給出 前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹:     3