import java.util.Scanner; /** * * 項目名稱:jobdu * 類名稱:Main2 * 類描述:構建二叉樹 * 建立人:黃傳聰 * 建立時間:2013-10-21 上午10:24:10 * 修改人: * 修改時間: * 修改備註: * @version */ public class Main2 { private char node; private Main2 lTree; private Main2 rTree; public Main2(char node) { this.node = node; this.lTree = null; this.rTree = null; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ String preOrder = scanner.next(); String inOrder = scanner.next(); //生成二叉樹 Main2 binTree = new Main2(preOrder.charAt(0)); generator(binTree,preOrder,inOrder); post(binTree); System.out.println(); } } private static void post(Main2 binTree) { // TODO Auto-generated method stub if(binTree != null){ post(binTree.lTree); post(binTree.rTree); System.out.print(binTree.node); } } private static Main2 generator(Main2 root ,String preOrder, String inOrder) { // TODO Auto-generated method stub // Main2 root = new Main2(preOrder.charAt(0)); //根節點在中序遍歷中的位置 int index = inOrder.indexOf(preOrder.charAt(0)); //拆分中序遍歷的左右子樹 String lInorder = inOrder.substring(0,index); String rInorder = inOrder.substring(index+1,inOrder.length()); //拆分前序遍歷節點 String lPreOrder = preOrder.substring(1,preOrder.length()-rInorder.length()); String rPreOrder = preOrder.substring(preOrder.length()-rInorder.length(),preOrder.length()); if(lPreOrder.length()>0){ root.lTree = new Main2(lPreOrder.charAt(0)); generator(root.lTree,lPreOrder,lInorder); } if(rPreOrder.length()>0){ root.rTree = new Main2(rPreOrder.charAt(0)); generator(root.rTree,rPreOrder,rInorder); } return null; } }c++ 實現: 1.直接輸出方式實現;2. 先建立二叉樹,再遍歷
#include <iostream> #include <string> using namespace std; struct Node{ char data; Node* lChild; Node* rChild; Node(char data){ this->data = data; lChild = NULL; rChild = NULL; } }; //生成二叉樹 void generator(Node* root, const string &pre, const string &mid){ if(pre.size() >0){ int index = mid.find(pre[0]); string pre_pre = pre.substr(1,index); string pre_mid = mid.substr(0,index); string post_pre = pre.substr(index+1,pre.size() - pre_pre.size() ); string post_mid = mid.substr(index+1,mid.size() - pre_mid.size()); if(pre_pre.size() > 0){ root->lChild = new Node(pre_pre[0]); generator(root->lChild, pre_pre, pre_mid); } if(post_pre.size() > 0){ root->rChild = new Node(post_pre[0]); generator(root->rChild, post_pre, post_mid); } } } //直接輸出 void pre_mid_post(const string &pre, const string &mid){ if(pre.size() <= 0) return; if(pre.size() == 1){ cout<<pre; return; } //拆分字符串 //前序遍歷,第一個字符爲根節點 int k = mid.find(pre[0]); string pre_pre = pre.substr(1,k); string pre_mid = mid.substr(0,k); pre_mid_post(pre_pre, pre_mid); string post_pre = pre.substr(k+1,pre.size() - k - 1); string post_mid = mid.substr(k+1,mid.size() - k - 1); pre_mid_post(post_pre,post_mid); cout<<mid[k]; } int main() { void post(Node* ); string pre, mid; while(cin>>pre>>mid){ pre_mid_post(pre, mid); cout<<endl; Node* root = new Node(pre[0]); generator(root , pre , mid); // cout<<root->data; post(root); } return 0; } //後序遍歷二叉樹 void post(Node* root){ if(root){ post(root->lChild); post(root->rChild); cout<<root->data; } }