編程之美 3.9 前序和中序得到後序

來源:互聯網
上載者:User

原理比較簡單,首先找到前序的第一個元素,尋找在中序中間的位置,這樣中序輸出被分成兩部分,那麼這前一部分屬於左子樹,後面部分屬於右子樹,如下所示:

a b d
c e f

d b a
e c f

分解成為

b d

d b

c e f

e c f

然後對這兩個部分採用類似的方法求解,最後得到二叉樹的描述,代碼如下:

/* * bop_3_9.cpp * *  Created on: 2012-5-25 *      Author: ict */#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <iostream>using namespace std;#define MAX 100typedef struct NODE{char ch;struct NODE *left;struct NODE *right;}Node, *PNode;//遞迴調用該方法,根據前序、中序得到後序PNode pre_in_to_af(char *pre, char *in){int index;char a1[MAX];//用於分割字串char a2[MAX];char b1[MAX];char b2[MAX];memset(a1, 0, MAX * sizeof(char));memset(a2, 0, MAX * sizeof(char));memset(b1, 0, MAX * sizeof(char));memset(b2, 0, MAX * sizeof(char));if(strlen(pre) == 0)return NULL;if(strlen(in) == 0)return NULL;string a = pre;string b = in;PNode p = (PNode)malloc(sizeof(Node));index = b.find_first_of(pre[0], 0);//找到指定字元在中序的位置p->ch = pre[0];strncpy(a1, pre + 1, index);//複製前序的前半部分strncpy(a2, pre + index + 1, strlen(pre) - index -1);//複製前序的後半部分strncpy(b1, in, index);//複製中序的前半部分strncpy(b2, in + index + 1, strlen(in) - index -1);//複製中序的後半部分p->left = pre_in_to_af(a1, b1);//遞迴尋找左子樹p->right = pre_in_to_af(a2, b2);//遞迴尋找右子樹return p;//返回根節點}//後序遍曆void afPrint(PNode p){if(p == NULL)return ;afPrint(p->left);afPrint(p->right);printf("%c", p->ch);return ;}int main(){char pre[MAX];char in[MAX];PNode head;scanf("%s", pre);scanf("%s", in);head = pre_in_to_af(pre, in);afPrint(head);return 0;}

------------------------------------------------華麗的分割線---------------------------------------------------

編程之美後面的擴充問題,如果知道前序和後序遍曆的結果,能重構二叉樹嗎?

這裡我們可以做一個一般的結論:

知道兩種遍曆結果,如果要重構二叉樹,其中一種必須是中序遍曆結果。

為什麼會這樣呢?我們首先可以舉一個非常簡單的例子:

前序走訪:a b

後序遍曆:b a

我們可以構造兩棵二叉樹滿足上面的遍曆結果,兩棵二叉樹的根節點都是a,但是一棵二叉樹的b為左節點,一棵二叉樹的b為右節點。

為什麼會這樣呢?

原來在前序走訪結果中,第一個遍曆元素一定是二叉樹的根節點;後續遍曆結果中,最後一個元素一定是二叉樹的根節點;這樣的話,我們只能確定根節點,但是我們不知道中間元素哪些是左子樹,哪些屬於右子樹,從而無法構造獨一無二的二叉樹。

相反,如果知道中序遍曆,我們通過前序或者後序獲得根節點,然後在中序中找到根節點,那麼根節點左半部分為左子樹,右半部分為右子樹,從而可以唯一確定二叉樹。

所以類似的,我們可以根據後序遍曆+中序遍曆,確定二叉樹,代碼和上面類似。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.