二叉樹 已知中序 後序 求前序
題意:
給出一棵二叉樹的中序和後序遍歷,求它的前序遍歷。
程式碼如下:
#include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <cstdlib> using namespace std; struct TNode { char cInfo; TNode * pLeft; TNode * pRight; }; #define NULL 0 #define LEN sizeof(TNode) typedef TNode * pBTNode; void vCreatTree(string sMidOrd,string sPostOrd,pBTNode pRoot) { int nLen,nPos; char cData; string sMidOrd1,sMidOrd2,sPostOrd1,sPostOrd2; pBTNode pLSon,pRSon; nLen=sPostOrd.size(); cData=sPostOrd[nLen-1]; pRoot->cInfo=cData; pRoot->pLeft=NULL; pRoot->pRight=NULL; nPos=sMidOrd.find(cData); if(nLen>1) { if(nPos>0) { sMidOrd1=sMidOrd.substr(0,nPos); sPostOrd1=sPostOrd.substr(0,nPos); pLSon=(struct TNode *)malloc(LEN); pRoot->pLeft=pLSon; vCreatTree(sMidOrd1,sPostOrd1,pLSon); } if(nLen-1>nPos) { sMidOrd2=sMidOrd.substr(nPos+1,nLen-nPos-1); sPostOrd2=sPostOrd.substr(nPos,nLen-nPos-1); pRSon=(struct TNode *)malloc(LEN); pRoot->pRight=pRSon; vCreatTree(sMidOrd2,sPostOrd2,pRSon); } } } //獲得前序遍歷 string sGetPreOrd(pBTNode pRoot) { string sRet; sRet=""; if(pRoot!=NULL) { sRet+=pRoot->cInfo; sRet+=sGetPreOrd(pRoot->pLeft); sRet+=sGetPreOrd(pRoot->pRight); } return sRet; } // 刪除樹 void vDeleteTree(pBTNode pRoot) { if(pRoot->pLeft!=NULL) { vDeleteTree(pRoot->pLeft); free(pRoot->pLeft); pRoot->pLeft=NULL; } if(pRoot->pRight!=NULL) { vDeleteTree(pRoot->pRight); free(pRoot->pRight); pRoot->pRight=NULL; } } //輸出 void vOutput(string sOut) { cout << sOut << endl; } int main() { string sMidOrd,sPostOrd,sPreOrd; pBTNode pRoot; while(cin >> sMidOrd >> sPostOrd) { pRoot=(struct TNode *)malloc(LEN); vCreatTree(sMidOrd,sPostOrd,pRoot); sPreOrd=sGetPreOrd(pRoot); vOutput(sPreOrd); //vDeleteTree(pRoot); free(pRoot); } return 0; } /* DCFEAB DFECBA */
相關推薦
二叉樹 已知中序 後序 求前序
題意: 給出一棵二叉樹的中序和後序遍歷,求它的前序遍歷。程式碼如下: #include <cstdio> #include <cstring> #include <string> #include <algorithm> #i
求先序排列(二叉樹已知中序和後序,求先序)
ostream ble sta EDA 題目 sam test c++ adc 問題 A: [2001_p3]求先序排列 時間限制: 1 Sec 內存限制: 125 MB提交: 90 解決: 73 題目描述 給出一棵二叉樹的中序與後序排列。求出它的先序排列
二叉樹-已知兩種遍歷求第三種
1,先序和中序,輸出後序 #include<iostream> #include<stack> using namespace std; const int N=1010; int n,pre[N],in[N]; //先序陣列和後序陣列 stack<int>
二叉樹 已知前序中序兩個序列,建立二叉樹(中序和後序也有)
本文主要講二叉樹的建樹,具體的說就是,題目給出你二叉樹的前序和中序,你來建樹,還有一個題目是給出中序和後序來建樹 第一題:A binary tree is a finite set of vertices that is either empty or consists
二叉樹已知 先序 中序 求後序遍歷序列
Tree描述Little Valentine liked playing with binary trees very much. Her favorite game was constructing
二叉樹的非遞迴遍歷(前序中序後序非遞迴C語言)
前兩天做資料結構實驗,要求用非遞迴演算法遍歷二叉樹。只知道用棧來儲存資料,具體演算法還不太清楚。經過兩天的搜尋,看到網上很多種解法,很多解法都是用C++來寫的演算法,一直找不到用C語言寫的演算法,所以就總結了一下,用C寫出了一個遍歷二叉樹的三種非遞迴演算法。 前
二叉樹的深度優先dfs遍歷(前序、中序和後序;遞迴與非遞迴)
//前序遍歷 //遞迴實現:根左右 void preOrder1(BinTree *root) { if (root != NULL) { cout<<root->data<<endl; preOrder1(root->lch
二叉樹 已知 兩種遍歷序列 求第三種遍歷序列
已知 前序和中序遍歷 求後序遍歷序列 struct node *creat(char *a, char *b, int n) { struct node *ptr; char
【資料結構】二叉樹的鏈式儲存結構(通過前序序列和中序序列構造二叉樹)
說明:需要分別輸入要二叉樹的前序序列和中序序列才能構建二叉樹。如果構建失敗,程式會報錯。 比如我們給定一個二叉樹,容易知道 前序序列為:GDAFEMHZ 中序序列為:ADEFGHMZ 程式執行結果: 原始碼 #include<stdio.h> #
根絕已知的遍歷順序(前序+中序||中序+後序)還原二叉樹詳解(轉)
最近做PAT遇到了還原二叉樹的問題,其實,這個演算法雖是基礎演算法,可是當真正比賽或者考試的時候不看模板還是不好寫的,因為遞迴的變數是要嚴格控制住的。 具體方法如下: 面試題目或多或少會出現這樣的選擇題或者簡答題: 首先我們得知道概念: 前序遍歷:先訪問當前節
已知一個按先序序列輸入的字元序列,如abc,,de,g,,f,,,(其中逗號表示空節點)。請建立二叉樹並按中序和後序方式遍歷二叉樹,最後求出葉子節點個數和二叉樹深度。
這是一個標準的模板題 記下了就完事了! Input 輸入一個長度小於50個字元的字串。 Output 輸出共有4行: 第1行輸出中序遍歷序列; 第2行輸出後序遍歷序列; 第3行輸出葉子節點個數; 第4行輸出二叉樹深度。 Sample Input abc,,
【樹】已知二叉樹前序和中序遍歷求後序遍歷,及中序和後序遍歷求前序遍歷
#include<iostream> using namespace std; //已知二叉樹前序遍歷和中序遍歷,求後序遍歷 void binary_tree_postorder(char* preorder,char* inorder,int length){
已知二叉樹的後序遍歷和中序遍歷求前序遍歷(二叉樹)
已知後序遍歷和中序遍歷重建二叉樹和已知前序遍歷和中序遍歷求後序遍歷的時候已經說明思路,這裡直接貼程式碼 # -*- coding:utf-8 -*- class Solution(object
二叉樹的非遞迴遍歷(先序、中序、後序和層序遍歷)
[前文] 二叉樹的非遞迴遍歷有 先序遍歷、中序遍歷 、後續遍歷 和 層序遍歷。 非遞迴演算法實現的基本思路:使用堆疊。而層序遍歷的實現:使用佇列。 如下圖所示的二叉樹: 前序遍歷順序為:ABCDE (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷
二叉樹的建立,查詢,輸出,先序,中序 ,後序遍歷 具體操作
//註釋改日補上。。。 #include<iostream> #include<cstdio> #include<cstdlib> #include<malloc.h> using namespace std; typedef
二叉樹的基本操作實現(建立、先序、中序、後序、層序)
[問題描述] 建立一棵二叉樹,試程式設計實現二叉樹的如下基本操作: 1. 按先序序列構造一棵二叉連結串列表示的二叉樹T; 2. 對這棵二叉樹進行遍歷:先序、中序、後序以及層次遍歷,分別輸出結點的遍歷序列; [基本要求] 從鍵盤接受輸入(先序),以二叉連結串列作為儲存結
二叉樹遍歷LeetCode#144 #94 #145 (前中後序遍歷)
題目:二叉樹的前序遍歷(遞迴以及非遞迴方法) 難度:Medium 思路:遞迴很簡單,非遞迴需要藉助棧來實現 程式碼: 遞迴程式碼 /** * Definition for a binary
二叉樹模板 先中後序遍歷,非遞迴演算法,層次遍歷,葉子結點數,深度
#include <iostream> #include<stdio.h> #include<malloc.h> #include<queue> #define MAX 50 using namespace std; type
二叉連結串列建立一棵二叉樹並進行前中後序遍歷
原始碼:#include<iostream>using namespace std;typedef char Datatype;struct TNode{ Datatype data; TNode* rchild; TNode* lchild;}
為什麽二叉樹總能中序線索化
思想 計算 編程 中序遍歷 發揮 合成 會有 二叉線索樹 整體 為什麽二叉樹為什麽總是可以按照中序遍歷線索化空指針是夠但怎麽保證不會有一個有左右孩子的節點不被別人指到想了想可以用類似於數學歸納法這樣證明: 先討論三種最簡單的情形 1. ab c b左指針