程式設計之美 重建二叉樹

2021-07-24 05:13:10 字數 2542 閱讀 4247

問題描述: 給出二叉樹先序遍歷和中序遍歷的結果,根據結果重建二叉樹。

舉例: 例如二叉樹

先序遍歷結果 為 abdcef  中序遍歷結果為 dbaecf,現根據結果重構二叉樹。

思路: 關鍵需要找到二叉樹每一層的根節點和子樹的長度。

例如先序遍歷中根節點必然是第乙個 

abdcef ,  通過中序遍歷可以發現 

dbaecf a的左側有兩個,右側有3個,說明左子樹側有兩個元素,右子樹側有3個元素。

在先序遍歷中,挨著a的元素,和與a相聚 pos_a_in_pre+(pos_a_in_mid+1)的元素便是下一層左右子樹根的位置

a b 

d  c 

e f。  

再依照這個方法遞迴,就可以重構出二叉樹。

示例程式:

typedef struct _node_st

node_st;

node_st* rebuild_pre_in1(char* ppreorder, char* pmidorder, int nlen)

pnewnode = new node_st();

pnewnode->_data = ppreorder[0];

for (i = 0 ;i < nlen; i++)

pnewnode->_pleft = rebuild_pre_in1(ppreorder+1, pmidorder, i);

pnewnode->_pright = rebuild_pre_in1(ppreorder+1+i, pmidorder+i+1, nlen-i-1);

return pnewnode;

}node_st* rebuild_pre_in2(char* pre, char* mid, int start, int length)

node->_pleft = rebuild_pre_in2(pre, mid, start+1, j);

node->_pright = rebuild_pre_in2(pre, mid, start+(j+1), length-j-1);

return node;

}void main()

; char mid = ;

int len = sizeof(pre)/sizeof(pre[0]);

node_st* proot = null;

proot = rebuild_pre_in1(pre, mid, 0, len);

proot = rebuild_pre_in2(pre, mid, 0, len);

cin>> len;

}

擴充套件問題

問題描述: 給出二叉樹後序遍歷和中序遍歷的結果,根據結果重建二叉樹。

一棵二叉樹後序遍歷結果 為 dbefca  中序遍歷結果為 dbaecf,現根據結果重構二叉樹。

與先序遍歷相反,後序遍歷的結果根節點在最後乙個元素。同樣可以根據後序找根節點,根據中序找子樹中元素個數。

根節點為 a dbefc

a, db

aecf a的左側有兩個元素,右邊有三個元素,這樣可以開始找a 的左/右子樹的根節點

因為右子樹有三個元素, 在後序遍歷的結果中從根節點向前跳過三個元素便是左子樹的根了,挨著a的便是右子樹的根

然後從中序遍歷中分別計算出左側搜尋的起始點,和右側搜尋的起點,再找到下一層左右子樹的元素個數。

示例程式:

typedef struct _node_st

node_st;

node_st* rebuild_pst_in1(char* pst, char* mid, int start, int length, int search_start)

node->_pleft = rebuild_pst_in1(pst, mid, start-j-1, length-j-1, start-j-1);

node->_pright = rebuild_pst_in1(pst, mid, start-1, j, length-1); // search_start : (length-j-1+j)==> length-1

return node;

}void main()

; char mid = ;

char pst = ;

int len = sizeof(pre)/sizeof(pre[0]);

node_st* proot = null;

proot = rebuild_pst_in1(pst, mid, len-1, len, len-1);

cin>> len;

}

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

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

《程式設計之美》 重建二叉樹

問題 已知二叉樹的前序和中序遍歷結果,重建二叉樹。分析與解法 typedef struct node node,bitree 前序 中序 void repreinbuild bitree t,重建的二叉樹 char preorder,前序遍歷序列 char inorder,中序遍歷序列 int n ...

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

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