国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現二叉樹遍歷序列的求解方法

2020-05-23 14:22:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++實現二叉樹遍歷序列的求解方法,需要的朋友可以參考下
 
 

本文詳細講述了C++實現二叉樹遍歷序列的求解方法,對于數據結構與算法的學習有著很好的參考借鑒價值。具體分析如下:

一、由遍歷序列構造二叉樹

         C++實現二叉樹遍歷序列的求解方法

    如上圖所示為一個二叉樹,可知它的遍歷序列分別為:

                      先序遍歷:ABDECFG

                      中序遍歷:DBEAFCG

                      后序遍歷:DEBFGCA

我們需要知道的是,由二叉樹的先序序列和中序序列可以唯一地確定一棵二叉樹;由二叉樹的后序序列和中序序列也可以唯一地確定一棵二叉樹;但是如果只知道先序序列和后序序列,則無法唯一確定一棵二叉樹。

二、已知二叉樹的先序序列和中序序列,求后序序列。

因為由二叉樹的先序序列和中序序列可以唯一地確定一棵二叉樹,所以進而可以唯一地確定它的后序遍歷。在先序遍歷序列中,第一個結點一定是二叉樹的根結點,而在中序遍歷中,根結點必然將中序序列分割成兩個子序列,前一個子序列就是左子樹的中序序列,后一個子序列就是右子樹的中序序列。根據這兩個子序列的長度,可以在先序序列中找到對應的左子樹先序序列和右子樹先序序列。而左子樹先序序列的第一個結點是左子樹的根結點,右子樹先序序列的第一個結點是右子樹的根結點。如此遞歸地進行下去,便能唯一地確定這棵二叉樹。

C++實現代碼如下:

/************************************************************************* > File Name: Test.cpp > Author: SongLee ************************************************************************/#include<iostream>using namespace std;struct TreeNode{  struct TreeNode* left;  struct TreeNode* right;  char elem;};TreeNode* PostOrderFromOrderings(char* inorder, char* preorder, int length){  if(length == 0)  {    return NULL;  }  TreeNode* node = new TreeNode;  node->elem = *preorder;  int rootIndex = 0;  for(; rootIndex < length; rootIndex++) // 求左子樹的長度  {    if(inorder[rootIndex] == *preorder)      break;  }  node->left = PostOrderFromOrderings(inorder, preorder + 1, rootIndex);  node->right = PostOrderFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));  cout << node->elem << " ";  // 求后序序列,所以最后輸出根結點  return node;}int main(){  char* pre = "ABDECFG";  char* in = "DBEAFCG";  PostOrderFromOrderings(in, pre, 7);  cout << endl;  return 0;}

三、已知二叉樹的后序序列和中序序列,求先序序列。

同理,由二叉樹的后序序列和中序序列也可以唯一地確定一棵二叉樹,所以進而可以唯一地確定先序遍歷序列。因為后序序列的最后一個結點就如同先序序列的第一個結點,可以將中序序列分割成兩個子序列,然后采用類似的方法遞歸地進行劃分。

C++實現代碼如下:

/************************************************************************* > File Name: Test1.cpp > Author: SongLee ************************************************************************/#include<iostream>using namespace std;struct TreeNode{  struct TreeNode* left;  struct TreeNode* right;  char elem;};TreeNode* PreOrderFromOrderings(char* inorder, char* postorder, int length){  if(length == 0)  {    return NULL;  }  TreeNode* node = new TreeNode;  node->elem = postorder[length-1];  int rootIndex = 0;  for(; rootIndex < length; rootIndex++)  // 求左子樹的長度  {    if(inorder[rootIndex] == postorder[length-1])      break;  }  cout << node->elem << " ";  // 求先序序列,所以先輸出根結點  node->left = PreOrderFromOrderings(inorder, postorder, rootIndex);  node->right = PreOrderFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex + 1));  return node;}int main(){  char* post = "DEBFGCA";  char* in = "DBEAFCG";  PreOrderFromOrderings(in, post, 7);  cout << endl;  return 0;}

相信本文所述實例對于大家學習數據結構與算法會起到一定的幫助作用。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乡宁县| 西吉县| 微山县| 达日县| 濮阳县| 泊头市| 凤阳县| 莱芜市| 桂平市| 密山市| 邵阳市| 平凉市| 太谷县| 电白县| 米林县| 深水埗区| 武安市| 游戏| 习水县| 微山县| 蓬安县| 湛江市| 孟州市| 紫阳县| 庆云县| 浦县| 湟源县| 沁阳市| 新丰县| 河池市| 桂东县| 兴安县| 安溪县| 尤溪县| 万载县| 汉源县| 金堂县| 周至县| 苏尼特左旗| 英超| 卢龙县|