1. 程式人生 > >給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷

給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷

#include <stdio.h>
#include <string.h>
struct Node{
    Node *lChild;
    Node *rChild;
    char c;
}Tree[50];      //靜態記憶體分配陣列
int loc;        //靜態陣列中已經分配的結點個數
Node *creat()
{
    Tree[loc].lChild = Tree[loc].rChild = NULL;
    return &Tree[loc++];
}
char str1[30],str2[30];
void postOrder(Node *T)
{
    if(T->lChild != NULL)
    {
        postOrder(T->lChild);
    }
    if(T->rChild != NULL)
    {
        postOrder(T->rChild);
    }
    printf("%c",T->c);
}
Node *build(int s1,int e1,int s2,int e2)
{
    Node *ret = creat();
    ret->c = str1[s1];
    int rootIdx;
    for(int i = s2;i <= e2;i++)
    {
        if(str2[i] == str1[s1])
        {
            rootIdx = i;
            break;
        }
    }
    if(rootIdx != s2)
    {
        ret->lChild = build(s1 + 1,s1 + (rootIdx - s2),s2,rootIdx - 1);
    }
    if(rootIdx != e2)
    {
        ret->rChild = build(s1 + (rootIdx - s2) + 1,e1,rootIdx + 1,e2);
    }
    return ret;
}
int main()
{
    while(scanf("%s",str1) != EOF)
    {
        scanf("%s",str2);
        loc = 0;
        int L1 = strlen(str1);
        int L2 = strlen(str2);
        Node *T = build(0,L1 - 1,0,L2 - 1);
        postOrder(T);
        printf("\n");
    }
    return 0;
}


相關推薦

給定,其後

#include <stdio.h> #include <string.h> struct Node{ Node *lChild; Node *rChild; char c; }Tree[50]; //靜態記憶體分配陣

給定一個數值。的路徑等於給定值的所有路徑

判斷是否有路徑 bool hasPathSum(TreeNode *root, int sum) { if(root==NULL) return false; sum-=root->val;

leetcode--maximum-depth-of-binary-tree(給定,找出它的最大深度)

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,1

Swift根據先確定

先序:12453687 後序:42518637 // // TreeNode.swift // Swift-Algorithm // // Created by Seven on 2018/10/19. // Copyright © 2018年 seven.

連結串列的方式建立,並以非遞迴演算法輸出;計算的繁茂度,並判斷是否為完全

以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度

建立(C語言)

後記:最近在看一本書,是紅衣教主周鴻禕寫的《我的網際網路方法論》,他講到了網際網路的本質——Free,沒錯,就是免費,Internet這條資訊高速公路不僅僅需要哪些專業人士去建造,而且需要我們每一個人來貢獻出一些東西,我們需要站在巨人的肩膀上去眺望未來,程式設計也是這樣,不要刀耕火種,我們需要交流,相互交流,

連結串列建立並進行前

原始碼:#include<iostream>using namespace std;typedef char Datatype;struct TNode{    Datatype data;    TNode* rchild;    TNode* lchild;}

C++ 推斷是否對稱

ack iostream 們的 log data 簡單 src -a nbsp 一棵二叉樹對稱,就是說它假設以根為軸,翻轉過去一樣。例如以下圖所看到的,以虛線為軸。把左邊翻轉到右邊,各頂點及頂點中的值一一相應。

[LeetCode] Trim a Binary Search Tree 修剪

imm res all ret bsp search root nts aries Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree s

判斷是否為排序

truct bool 結點 i++ true 源代碼 flag brush %d 判斷二叉排序樹的代碼如下: static boolean IsSearchTree(Bitree *t) { if(!t) //空二叉樹情況 return

兩種方式可以唯一確定嗎?

按照資料結構課本上的說法: 前序遍歷+中序遍歷 後序遍歷+中序遍歷 可以唯一確定一棵二叉樹。 反例:          1            &nbs

判斷是否為另的子結構(JAVA版本)

分析:判斷root1是否為root2的子樹?首先,必須先找到樹1中與樹2的根節點相同的節點,然後判斷從該節點開始root1中是否root2的結構;若有,則返回true,若沒有,則返回false?答案是No! 因為二叉樹root1中可能含有值相同的節點,所以,如果沒有找到,就需要繼續遍歷root1.

劍指offer:輸入,判斷該是否是平衡

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 //後續遍歷二叉樹,遍歷過程中求子樹高度,判斷是否平衡 class Solution { public: bool IsBalanced(TreeNode *root, int & dep){

如何

二叉樹的遍歷分為三種:前序遍歷 中序遍歷 後序遍歷 前序遍歷:按照“根左右”,先遍歷根節點,再遍歷左子樹 ,再遍歷右子樹 中序遍歷:按照“左根右“,先遍歷左子樹,再遍歷根節點,最後遍歷右子樹 後續遍歷:按照“左右根”,先遍歷左子樹,再遍歷右子樹,最後遍歷根節點 其中前

【資料結構週週練】020 利用遞迴判斷是否為排序

一、二叉排序樹 二叉排序樹可以說是資料結構中相當重要的內容之一啦,前兩次給大家講了二叉排序樹的建立、遍歷與查詢。今天給大家分享的是二叉排序樹的應用,判斷一個二叉樹是否為一棵二叉排序樹。 二叉排序樹的特點大家都知道,左子樹根結點值<根結點<右子樹根結點值,並且中

重建

根據先序,中序重建一棵二叉樹; 思路:中序確定根節點,遞迴到葉子,在回溯建樹 程式碼: #include <iostream> #include <assert.h> using namespace std; typedef char Datatype; stru

《劍指offer》把列印成多行

注:此部落格不再更新,所有最新文章將發表在個人獨立部落格limengting.site。分享技術,記錄生活,歡迎大家關注 題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 im

複製的非遞迴演算法

二叉連結串列型別定義: typedef char TElemType; // 設二叉樹的元素為char型別 typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; } BiT

C++作業:將左右孩子互換 / 複製

/* 邵發, 1309班, */ /* 12周作業 練習1:編寫遞迴演算法、將左右孩子互換 (用遞迴) 練習2:編寫複製一棵二叉樹 (不用遞迴) */ #include <stdio.h> // 定義節點 struct Node { int val

《牛客網劍指offer38題》輸入的深度

題目:輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 結果:牛客網編譯通過 思路及程式碼: //中心思想就是遞迴遍歷一遍二叉