前序遍歷序列和中序遍歷序列構造二叉樹演算法
轉自: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,