1. 程式人生 > >由二叉樹前序序列、中序序列輸出相應後續序列

由二叉樹前序序列、中序序列輸出相應後續序列

題目描述:

給定一棵二叉樹的前序遍歷和中序遍歷序列,求其後序遍歷續列(注:給定中序遍歷序列,只要知道前序、後序或者層次遍歷的一種就能唯一的確定一棵二叉樹)。

輸入:

兩個字串,其長度均小於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