C++實現已知二叉樹前序遍歷和中序遍歷,求後序遍歷

一、基本概念
1.先序遍歷(NLR)可以確定二叉樹的父子結點;
 
2.中序遍歷(LNR)可以確定二叉樹的左右子樹;
 
3.後序遍歷(LRN)可以確定二叉樹的父子結點;
 
二、結論
1.已知先序遍歷,中序遍歷序列,能夠創建出一棵唯一的二叉樹,可以得出二叉樹的後序遍歷;
 
2.已知後序遍歷,中序遍歷序列,能夠創建出一棵唯一的二叉樹,進而可以得出二叉樹的先序序列;
 
3.綜上,必須含有中序遍歷(確定二叉樹左右孩子),先序遍歷或者後序遍歷任選一個(確定二叉樹父子結點),就可以確定一棵唯一的二叉樹
 
三、C++代碼實現
1.已知先序遍歷和中序遍歷,打印後序遍歷(見函數void postorder(string preorder, string inorder));
 
2.已知中序遍歷和後序遍歷,打印先序遍歷(見函數void preorder(string inorder, string postorder));
 
#include<iostream>
#include<string>
using namespace std;
/*
假設根節點在中序遍歷中的位置爲pos,樹的結點數爲len,即 len=inorder.length() 
代碼:pos = inorder.find(preorder[0]) or pos = inorder.find(postorder[postorder.size()-1]) 
先序遍歷(NLR), 根節點編號(0), 左子樹編號(1~pos), 右子樹編號(pos+1~len-1) 
中序遍歷(LNR), 左子樹編號(0~pos-1), 根節點編號(pos), 右子樹編號(pos+1~len-1)  
後序遍歷(LRN), 左子樹編號(0~pos-1), 右子樹編號(pos~len-2), 根點編號(len-1) 
*/
void postorder(string preorder,string inorder){//由先序遍歷+中序遍歷序列,遞歸實現後序遍歷 (LRN) 
int len = preorder.length();
if(len==0)
return;
if(len==1)
{  //單個結點 
cout<<preorder[0];
return;
}
int pos=inorder.find(preorder[0]);   // 查找根節點在中序序列中的位置,通過根節點劃分左右子樹 
    // 類似於後序遍歷過程
postorder(preorder.substr(1,pos), inorder.substr(0,pos));//後序遍歷左子樹
postorder(preorder.substr(pos+1,len-pos-1), inorder.substr(pos+1,len-pos-1));//後序遍歷右子樹,pos從0開始,所以len-pos-1 
cout<<preorder[0];    //最後輸出根節點 
}
void preorder(string inorder, string postorder) //由中序遍歷+後序遍歷序列,遞歸實現先序序列 (NLR)
{
int len = postorder.length();
if (len == 0) // 空樹 
return;     
if(len == 1)   // 單個結點
{
cout<<inorder[0];
return ;
}
int pos = inorder.find(postorder[len-1]);
    // 類似於先序遍歷過程
cout<<postorder[len-1]; 
preorder(inorder.substr(0, pos),  postorder.substr(0, pos)); //先序遍歷左子樹 
preorder(inorder.substr(pos+1, len-pos-1), postorder.substr(pos, len-pos-1));//先序遍歷右子樹 
}
 
int main()
{
    string s1,s2;
    while(cin>>s1>>s2)
    {
        postorder(s1,s2);
      // preorder(s1, s2); 
        cout<<endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章