由二叉樹前序序列、中序序列輸出相應後續序列
題目描述:
給定一棵二叉樹的前序遍歷和中序遍歷序列,求其後序遍歷續列(注:給定中序遍歷序列,只要知道前序、後序或者層次遍歷中的一種就能唯一的確定一棵二叉樹)。
輸入:
兩個字串,其長度均小於26。
第一行為前序遍歷,第二行為中序遍歷。二叉樹的結點名稱以大寫字母表示:A,B,C,D.......,最多26個字母。
輸出:
輸入樣例可能有多組,對於每組測試樣例,輸出一行,為後續遍歷的字串。
樣例輸入:
ABC
BAC
FDXEAG
XDEFAG
樣例輸出:
BAC
XEDGAF
問題分析:
本題目涉及二叉樹的建立、遍歷、還原、刪除等操作。給定二叉樹的前序及中序就可以唯一的確定一棵二叉樹,然後對二叉樹
進行後續遍歷一次,就可以得到所求的後序序列。遍歷採用遞迴的遍歷,以減少程式碼量,免得出錯。
直接看程式碼吧:
#include<stdio.h> #include<string.h> #include<malloc.h> #include<algorithm> using namespace std; typedef struct node //二叉樹結點結構體 { struct node * lchlid; struct node * rchild; char data; }Node; Node * Convert(char PS[],char IS[],int pl,int pr,int il,int ir) {//由前序序列,中序序列構造二叉樹的函式 if (pl<=pr) { Node * p=(Node *)malloc(sizeof(Node)); //分配記憶體,建立樹結點 p->data=PS[pl]; int k =il; while(IS[k]!=PS[pl]) k++; p->lchlid = Convert(PS,IS,pl+1,pl+k-il,il,k-1); //遞迴建立左子樹 p->rchild = Convert(PS,IS,pl+k-il+1,pr,k+1,ir); //遞迴建立右子樹 return p; } else return NULL; } void PostOrder(Node * p) //二叉樹的後續遍歷 { if (p!=NULL) { PostOrder(p->lchlid); PostOrder(p->rchild); printf("%c",p->data); free(p); //銷燬結點,釋放記憶體 } } int main() { char PostStr[26],InStr[26]; while (scanf("%s%s",PostStr,InStr)!=EOF) //輸入前序及後序中序序列 { int len = strlen(PostStr); if (len!=strlen(InStr)) { printf("錯誤:輸入前序序列與中序序列不等長!");exit(0); } Node * T = Convert(PostStr,InStr,0,len-1,0,len-1); //建立一棵二叉樹 PostOrder(T); //遍歷並輸出二叉樹的後序序列 } return 0; }
黑框框執行結果:
後記:
注意二叉樹的結構體的定義方法,本程式碼使用C語言(C++稍有不同),在用malloc進行動態分配記憶體前要引用標頭檔案
malloc.h,記憶體分配後也要在合適時候對記憶體進行回收。
參考了王道系列的《計算機考研——機試指南》。
相關推薦
由二叉樹前序序列、中序序列輸出相應後續序列
題目描述: 給定一棵二叉樹的前序遍歷和中序遍歷序列,求其後序遍歷續列(注:給定中序遍歷序列,只要知道前序、後序或者層次遍歷中的一種就能唯一的確定一棵二叉樹)。 輸入: 兩個字串,其長度均小於26。 第
二叉樹經典問題——已知中序和前序重建二叉樹
運用前序和中序序列重建二叉樹及其相關應用 重建過程 1,在二叉樹的學習中經常會遇到一類問題,就是給出一棵二叉樹的前序和中序序列(後序和中序類似)然後求樹的深度、樹的後序序列、樹的各種遍歷等等問題,這個時候如果能根據相關的序列把其代表的二叉樹重建出來,那麼所
LeetCode:二叉樹的非遞歸中序遍歷
== bin printf [0 -1 中序 present %d res 第一次動手寫二叉樹的,有點小激動,64行的if花了點時間,上傳leetcode一次點亮~~~ 1 /* inorder traversal binary tree */ 2 #include
資料結構 樹筆記-7 二叉樹的非遞迴中序遍歷
二叉樹的 非遞迴 中序遍歷 //#define ElemType char typedef char ElemType; 結點中存放的資料的型別的定義
資料結構篇:二叉樹(三:根據中序和後序遍歷結果推算出完整二叉樹)
我們先理解一下前中後序遍歷,這是基礎。 //前序遍歷 void Tree::PreOrderTraverse(BiTree *T) { if(!T) { return ; } else { cout<<T->data<<" "; PreOrder
二叉樹C++ | 查詢節點(中序搜尋)_5
查詢節點(中序搜尋) /* C++ program to find Inorder successor in a BST */ #include<iostream> using namespace std; struct Node { int data; struct
sdut oj2804 求二叉樹的深度(根據中序以及後序遍歷求樹)
求二叉樹的深度 Time Limit: 1000MS Memory limit: 65536K 題目描述 已知一顆二叉樹的中序遍歷序列和後序遍歷序列,求二叉樹的深度。 輸入 輸入資料有多組,輸入T,代表有T組資料。每組資料包括兩個長度小於50的字串,第
[二叉樹] △ 6.65 已經前序序列、中序序列 建立 二叉樹(二叉連結串列)
題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.65 【題目】6.65 已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉連結串列。 【答案】 // 6.65
樹的學習——(遞迴構建二叉樹、遞迴非遞迴前序中序後序遍歷二叉樹、根據前序序列、中序序列構建二叉樹)
前言 最近兩個星期一直都在斷斷續續的學習二叉樹的資料結構,昨晚突然有點融匯貫通的感覺,這裡記錄一下吧 題目要求 給定前序序列,abc##de#g##f###,構建二叉樹,並且用遞迴和非遞迴兩種方法去做前序,中序和後序遍歷 二叉樹的資料結構 #define STACKSI
二叉樹前序、中序遍歷得到後序遍歷
() level struct OS spa str sel src [] 二叉樹的前序遍歷為:{1,2,4,7,3,5,6,8},中序遍歷為:{4,7,2,1,5,3,8,6},求後序遍歷 # -*- coding:utf-8 -*- class Nod
數據結構35:二叉樹前序遍歷、中序遍歷和後序遍歷
tdi 代碼 nod 完成 循環 同時 reat pan 設置 遞歸算法底層的實現使用的是棧存儲結構,所以可以直接使用棧寫出相應的非遞歸算法。 先序遍歷的非遞歸算法 從樹的根結點出發,遍歷左孩子的同時,先將每個結點的右孩子壓棧。當遇到結點沒有左孩子的時候,取棧頂的右
二叉樹前序、中序、後序(遞迴 / 非遞迴)遍歷
前語 二叉樹的遍歷是指按一定次序訪問二叉樹中的每一個結點,且每個節點僅被訪問一次。 前序遍歷 若二叉樹非空,則進行以下次序的遍歷: 根節點—>根節點的左子樹—>根節點的右子樹 若要遍歷左子樹和右子樹,仍然需要按照以上次序進行,所以前序遍歷也是一個遞
【演算法】二叉樹前序、中序、後序遍歷相互求法(轉)
二叉樹前序、中序、後序遍歷相互求法 原文地址 今天來總結下二叉樹前序、中序、後序遍歷相互求法,即如果知道兩個的遍歷,如何求第三種遍歷方法,比較笨的方法是畫出來二叉樹,然後根據各種遍歷不同的特性來求,也可以程式設計求出,下面我們分別說明。  
已知中序、後序構造二叉樹(關鍵詞:二叉樹/前序/先序/中序/後序/先根/中根/後根/遍歷/搜尋/查詢)
已知中序、後序構造二叉樹 遞迴演算法 def buildTree(inorder, postorder): if inorder and postorder: postRootVal = postorder
已知前序、中序構造二叉樹(關鍵詞:二叉樹/前序/先序/中序/後序/先根/中根/後根/遍歷/搜尋/查詢)
已知前序、中序構造二叉樹 實現 def buildTree(self, preorder, inorder): if inorder: rootVal = preorder.pop(0) rootIdx = inorder.index(rootVal) root
二叉樹——前、中、後序遍歷遞迴以及非遞迴寫法
#include <iostream> #include <stack> #include <queue> using namespace std; typedef struct Node{ int data; Node *l
二叉樹前序、中序、後序遍歷求法
二叉樹前序、中序、後序遍歷相互求法 二叉樹的三種遍歷方法: 前序遍歷: 1.訪問根節點 2.前序遍歷左子樹 3.前序遍歷右子樹 中序遍歷: 1.中序遍歷左子樹 2.訪問根節點 3.中序遍歷右子樹 後序遍歷: 1.後序遍歷左子樹 2.後序遍歷右子樹 3.訪問根節
根據二叉樹前序遍歷和中序遍歷序列求解後序遍歷的演算法
問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。 關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。 利用
二叉樹前序、中序、後序遞迴與非遞迴遍歷+層序遍歷(java)
前序遞迴遍歷演算法:訪問根結點-->遞迴遍歷根結點的左子樹-->遞迴遍歷根結點的右子樹 中序遞迴遍歷演算法:遞迴遍歷根結點的左子樹-->訪問根結點-->遞迴遍歷根結點的右子樹 後序遞迴遍歷演算法:遞迴遍歷根結
已知二叉樹前序、中序遍歷用python求後序遍歷
這裡用到遞迴的方法:遞迴的關鍵是找到出口和遞迴的狀態(也就是要寫出遞迴第一個完整的過程),這樣計算機才能明白以後的若干步怎麼去走。當然,實際中遞迴的方法效率不高(不表明它不快),因為要頻繁呼叫函式本身,所以容易爆炸(哈哈哈)。程式碼:def last_sort(str1, s