本文詳細講述了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;}
相信本文所述實例對于大家學習數據結構與算法會起到一定的幫助作用。
新聞熱點
疑難解答