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...