1. 程式人生 > >前序遍歷序列和中序遍歷序列構造二叉樹演算法

前序遍歷序列和中序遍歷序列構造二叉樹演算法

轉自:https://blog.csdn.net/github_35124642/article/details/51735307

前序,中序遍歷,在此就不向大家向下說明了,如有不懂請先理解,再來看此篇文章。

當我們拿到前序和中序時,如何重新構建一顆新的數呢?

首先,大家都知道的,由中序遍歷序列可知,第一個節點是根節點,
其次,由前序遍歷序列可知,第一個節點是根節點的左子樹節點,而且前序遍歷中,根節點左邊是左子樹,右邊是右子樹
,因此通過中序遍歷的根節點可以確定的是:

根節點在前序遍歷中的位置(通過遍歷前序遍歷序列,比較每一個節點與中序遍歷中的第一個節點即根節點可知); 左子樹的節點數,因為一旦找到前序遍歷中根節點的位置,就找到左右子樹的分界點,也就是說,前序遍歷中根節點左邊的都是左子樹節點,可以通過遍歷知道左子樹的節點數; 同樣,右子樹的節點數也可以確定。

我們可以這樣來重新構造它。

假如,我們要構建的樹是這樣的


現在,我們知道它的根節點,和左右節點的個數,正如下圖


然後現在,我們只能重建它的左樹,然後重建它的右樹。依次這樣遞迴下去

<span style="font-size:18px;">void Findpost(const vector<T> prev, const vector<T> in)  
    {  
        Del();  
        _root = Greattree(prev,in);  
    }  
  
    BinaryTreeNode<T>* Greattree(const vector<T> prev, const vector<T> in)  
    {  
        if(prev.size() == 0 || in.size() == 0)  //如果前序或中序的值為空的話,條件不滿足  
            return NULL;  
  
        T gen = 0;  
        BinaryTreeNode<T>* root = new BinaryTreeNode<T>(prev[0]);  //首先建立根節點  
  
        vector<T> prev_p,prev_e;  
        vector<T> in_p,in_e;  
  
        for(int i = 0;i < in.size();i++)    //尋找根節點在中序中的位置  
        {  
            if(in[i] == prev[0])  
            {  
                gen = i;  
                break;  
            }  
        }  
  
        for(int i = 0;i < gen; i++)   //計算出左節點個數  
        {  
            in_p.push_back(in[i]);  
            prev_p.push_back(prev[i+1]);  
        }  
  
        for(int i = gen+1; i< in.size(); i++ )  //計算右系欸但個數  
        {  
            in_e.push_back(in[i]);  
            prev_e.push_back(prev[i]);  
        }  
  
        root->_left = Greattree(prev_p,in_p);  //依次遞迴下去  
        root->_right = Greattree(prev_e,in_e);  
        return  root;  
          
    }  
</span>  

LeetCode:105

相關推薦

序列序列構造演算法

轉自:https://blog.csdn.net/github_35124642/article/details/51735307前序,中序遍歷,在此就不向大家向下說明了,如有不懂請先理解,再來看此篇文章。當我們拿到前序和中序時,如何重新構建一顆新的數呢?首先,大家都知道的,

根據序列序列構造演算法

http://blog.csdn.net/yunzhongguwu005/article/details/9270085  1 確定根,確定左子樹,確定右子樹  2 在左子樹中遞迴  3 在右子樹中遞迴  4 列印當前根 I 前序遍歷的第一個就是根。 II 中序遍歷根據根,

根據序列序列構造

根據前序遍歷序列和中序遍歷序列可以構造唯一的二叉樹。假設序列為string型根據前序遍歷的特點, 知前序序列(Pre)的首個元素(Pre[0])為根(root),  然後在中序序列(In)中查詢此根(Pre[0]),  根據中序遍歷特點, 知在查詢到的根(root) 前邊的序

已知的先序列序列,輸出該的後序列

iostream code tor data- span main ast avi dsm 題目描寫敘述 輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。 輸入 第一行輸入二叉樹的先序遍歷序列; 第二行輸入二叉樹的中序遍歷序列。 輸出 輸出該二叉樹的

構造

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

學習筆記之使用構造

總結一下學習筆記: 一、提出問題 給出一棵樹的前序遍歷和中序遍歷,構造二叉樹,你可以假設這棵樹中不存在重複的數。 例如:給出前序和中序遍歷序列:preorder = [3,9,20,15,7],inorder=[9,3,15,20,7] 得到如下所示的二叉樹:

LeetCode105題:從前序列構造

思路:  首先要清楚二叉樹的前序遍歷和中序遍歷的過程。所謂的前序遍歷,其遍歷順序為:當前節點-->左子樹-->右子樹;而中序遍歷的遍歷順序為:左子樹-->當前節點-->右子樹。因此,中序遍歷序列中某一節點的左右兩側則分別為其左右子樹。這樣思路就出來了,

【面試題】根據構造

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

根據層次序列構造

程式碼如下,思路詳見註釋: #include<stdio.h> #include<iostream> #include<queue> using namespace std; typedef struct Bitree{ char d

通過序列構造(非遞迴)

題目:通過二叉樹的中序和後序遍歷序列構造二叉樹 同樣,使用分治法來實現是完全可以的,可是在LeetCode中執行這種方法的程式碼,總是會報錯: Memory Limit Exceeded  ,所以這裡還是用棧來實現二叉樹的構建。 與用先序和後序遍歷構造二叉樹的方法類似,

lintcode- 構造-73

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

通過先序列構造

給出一棵二叉樹的先序和中序遍歷的序列,構造出該二叉樹。 思路一:採用分治法。 1)取先序遍歷序列的第一個值,用該值構造根結點,,然後在中序遍歷序列中查詢與該元素相等的值,這樣就可以把序列分為三部分:左

通過的先序列構造

題目:給出一棵二叉樹的先序和中序遍歷的序列,構造出該二叉樹。 思路一:採用分治法。 1)取先序遍歷序列的第一個值,用該值構造根結點,,然後在中序遍歷序列中查詢與該元素相等的值,這樣就可以把序列分為三部分:左子樹(如果有)、根結點和右子樹(如果有)。 2)將兩個序列都分成三部

七:重建(依據先(或者後重建

off 相同 tree int roo 節點 先序 throw -a 對於一顆二叉樹。能夠依據先序遍歷(或者後序遍歷)和中序遍歷(樹中不含反復的數字)又一次還原出二叉樹。 解析: 1. 先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。 2. 依

[Leetcode] Construct binary tree from inorder and postorder travesal 利用後續構造

post right clas end opened tree 數組 isp solution Given inorder and postorder traversal of a tree, construct the binary tree. Note: You ma

根據構造

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

105 Construct Binary Tree from Preorder and Inorder Traversal 從前序列構造

leet blog pub struct class null true ems inorder 給定一棵樹的前序遍歷與中序遍歷,依據此構造二叉樹。註意:你可以假設樹中沒有重復的元素。例如,給出前序遍歷 = [3,9,20,15,7]中序遍歷 = [9,3,15,20,7]

leetcode 105. 從前序列構造

binary col build for treenode class order dfs leetcode 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 註意:你可以假設樹中沒有重復的元素。 例如,給出 前序遍歷 preorder = [3,9,20,15,7] 中序遍歷

72 構造

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

[leetcode]從中與後/序列構造

nod leetcode int 構造二叉樹 else begin 順序 strong 分割 從中序與後序遍歷序列構造二叉樹 根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 註意: 你可以假設樹中沒有重復的元素。 例如,給出 中序遍歷 inorder = [9,3,15,20,