程式設計之美 3 9 重建二叉樹

2021-09-08 15:41:17 字數 1413 閱讀 4147

1. 簡述

給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下:

struct

node ;

假設已經有了前序遍歷和中序遍歷結果,希望通過乙個演算法重建這棵樹。

給定函式的定義如下:

void

rebuild(

char

*ppreorder, 

char

*pinorder, 

intntreelen, node

**proot);

引數ppreorder:前序遍歷結果的字串陣列。

pinorder: 中序遍歷結果的字串陣列。

ntreelen: 樹的長度。

proot:     根據前序和中序遍歷結果重新構建樹的根節點。

例如前序遍歷結果:a b d c e f

中序遍歷結果:d b a e c f

2. 思路

遞迴解決相對容易些。

遞迴結束條件是長度小於1,此時令*proot=null即可。

遞迴主體中,在中序遍歷結果中找前序結果的第乙個字元,找到後記錄其下標為index,如果找不到說明前序遍歷和中序遍歷有問題,說明錯誤資訊,然後直接返回。找到index後,新建乙個節點,讓*proot指向它,其數值為前序的第乙個字元,然後遞迴求*proot的左孩子和右孩子。

遞迴左孩子:rebuild( ppreorder+1,pinorder, index, &((*proot)->pleft) )

遞迴右孩子:rebuild( ppreorder+index+1, pinorder+index+1, ntreelen-index-1, &((*proot)->pright) )

3. **   

#include 

<

iostream

>

#include 

<

stack

>

using

namespace

std;

struct

node ;

void

rebuild(

char

*ppreorder, 

char

*pinorder, 

intntreelen, node

**proot) 

else

else

}  }

void

printtree(

const

node

*root) 

}int

main() 

輸出結果為:

4. 參考

程式設計之美,3.9節,重建二叉樹

程式設計之美 3 9重建二叉樹

題目 給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下 struct node 假設已經有了前序遍歷和中序遍歷結果,希望通過乙個演算法重建這棵樹。給定函式的定義如下 void rebuild char ppreorder,char pinorder,int ntreelen,node p...

3 9 重建二叉樹

題目 給定一顆樹的先序遍歷結果和中序遍歷的結果,重建這顆樹。例如 前序 ab d c e f 中序 d bae c f a是根節點。思路 根據前序,可以很快找出根節點a,然後根據中序,可以找出根節點a的左右子樹,然後遞迴求a的左子樹前序b d跟中序d b,a的右子樹前序c e f跟中序e c f即可...

重建二叉樹(程式設計之美)

from 程式設計之美3.9 給出前序遍歷和中序遍歷,重新建立二叉樹,後序遍歷輸出。如下 1 include 2 include 3 4using namespace std 56 struct node7 1213 void aftertra node proot 1419 aftertra pr...