1. 程式人生 > >L2-006. 樹的遍歷

L2-006. 樹的遍歷

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。

輸入格式:

輸入第一行給出一個正整數N(<=30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

輸出格式:

在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

輸入樣例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:

4 1 6 3 5 7 2

解析:根據後序遍歷可確定根(後序遍歷最後一位),知道根可以在中序遍歷找到左子樹中序遍歷序列和右子樹中序遍歷序列(根的前邊為左子樹後邊為右子樹)

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int be[100],mi[100];
struct node
{
    int l,r;
}father[100];
int find(int mil,int mir,int bel,int ber)
{
    int root,p1,p2;
    if(mil>mir)
        return 0;
    root=be[ber];
    p1=mil;
    //p1根的位置
    while(mi[p1]!=root)
        p1++;
    p2=p1-mil;   //p2左子樹的長度,根據p1來確定前序遍歷的起點和終點,根據p2來確定後序遍歷的起點和終點
    father[root].l=find(mil,p1-1,bel,bel+p2-1);
    father[root].r=find(p1+1,mir,bel+p2,ber-1);
    return root;
}
void bfs(int v)
{ int i=0,a[100];
    queue<int>s;
 s.push(v);
 while(!s.empty())
 {
     int w=s.front();
     s.pop();
     a[i++]=w;//儲存層序遍歷
     if(father[w].l!=0)
        s.push(father[w].l);
     if(father[w].r!=0)
        s.push(father[w].r);
 }
 for(int j=0;j<i;j++)
    printf("%d%c",a[j],j==i-1?'\n':' ');

}
int main()
{
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>be[i];
    for(i=0;i<n;i++)
        cin>>mi[i];
    find(0,n-1,0,n-1);
    bfs(be[n-1]);
}


相關推薦

團體程序設計天梯賽 L2-006. L2-011. 玩轉二叉

sca urn post 程序設計 pos 樹的遍歷 stdlib.h con gpo L2-006. 樹的遍歷 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <strin

天梯賽L2-006.

文本對比 鍵值 inpu 多余 sizeof stdlib.h 文本 urn tps L2-006. 樹的遍歷 時間限制 400 ms 內存限制 65536 kB 代碼長度限制 8000 B 判題程序 Standard

【天梯賽】L2-006. (層次

題目描述: 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。 輸入格式: 輸入第一行給出一個正整數N(<=30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。 輸出格式

L2-006.

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。 輸入格式: 輸入第一行給出一個正整數N(<=30),是二叉樹中結點的個數。第二行給出其後序遍歷序

天梯賽 L2-006 (序列建樹)

math bfs uil 一個 names def 代碼 整數 std L2-006 樹的遍歷 (25 分) 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裏假設鍵值都是互不相等的正整數。 輸入格式: 輸入第一行給出一個正整數N(≤

二叉 C#

這就是 中序 工作 class stat public 完全 每一個 前期準備 二叉樹遍歷 C# 什麽是二叉樹   二叉樹是每個節點最多有兩個子樹的樹結構  (1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結

[javaSE] 數據結構二叉-與查找

ngx quest wan ase ngs san http zhong ros %E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%80%9D%E7%BB%B4%E9%80%BB%E8%BE%91%2018%

二叉非遞歸算法——中序

spa tdi str max logs nor 算法實現 中序遍歷 非遞歸   二叉樹中序遍歷的非遞歸算法同樣可以使用棧來實現,從根結點開始,將根結點的最左結點全部壓棧,當結點p不再有最左結點時,說明結點p沒有左孩子,將該結點 出棧,訪問結點p,然後對其右孩子做同樣的處理

HDU 1710Binary Tree Traversals(已知前序中序,求後序的二叉)

pid http pan clu names pty efi images 樹遍歷 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解題思路:可以由先序和中序的性質得到 : 先序的第一個借點肯定是當前子樹的根結點, 那

STL實現二叉

nod 數據 blog new friend const turn ace lrn #include<iostream> using namespace std; template<class Type> class BSTree; templat

二叉

while nbsp .net right 三種 pos tail stack實現 order 二叉樹遍歷最簡單的就是遞歸了。因為遞歸實質上是棧存了一些中間值,所以我們可以使用stack實現叠代版的遍歷。 中序遍歷 步驟: 首先將root節點作為當前節點。

golang實現

order tac root clas postorder ont 後序 pri bsp package main import ( "container/list" "fmt" ) type MyStack struct { List *l

二叉——篇(c++)

比較 方便 || 遍歷二叉樹 找到 保存 們的 order out 二叉樹——遍歷篇 二叉樹很多算法題都與其遍歷相關,筆者經過大量學習並進行了思考和總結,寫下這篇二叉樹的遍歷篇。 1、二叉樹數據結構及訪問函數 #include <stdio.h> #includ

二叉算法總結

使用 preorder 說明 stack height type pri content 結構圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

二叉 - 和存儲結構

前序遍歷 main inorder esp bottom ive align return c 編程 在《二叉樹的定義和性質》中我們已經認識了二叉樹這種數據結構。我們知道鏈表的每個節點可以有一個後繼,而二叉樹(Binary Tree)的每個節點可以有兩個後繼。比如這樣定義二

】二叉算法(深度優先、廣度優先,前序、中序、後序、層次)及Java實現

order new link left 算法 很多 == 都是 off 二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義

二叉(先序、中序、後序)

廣度 nsh 直接 循環 ron color lan 通過 ogr 二叉樹的遍歷(遞歸與非遞歸) 遍歷:traversal  遞歸:recursion 棧----------回溯----------遞歸 棧和回溯有關 本文討論二叉樹的常見遍歷方式的代碼(Java)實現,包括

二叉(王道)

中序 數組 har 不為 位置 mem 一行 遍歷 uil 題目描述: 二叉樹的前序、中序、後序遍歷的定義:前序遍歷:對任一子樹,先訪問跟,然後遍歷其左子樹,最後遍歷其右子樹;中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹;後序遍歷:對任一子樹,先遍歷其

【二叉】二叉總結

struct left else oot nor 節點 操作 preorder AC   節點定義如下 1 // Definition for a binary tree node. 2 struct TreeNode { 3 int val; 4 Tre

一道關於二叉的題目

inf 一道 .com 順序 序列 技術 題目 bubuko 圖片 以下序列中不可能是一顆二叉查找樹的後序遍歷結構的是:(B) A: 1,2,3,4,5 B: 3,5,1,4,2 C: 1,2,5,4,3 D: 5,4,3,2,1 二叉查找樹:左子樹比根小,右子樹比根大後序