根據前序和中序的遍歷序列重建二叉樹

2021-07-15 00:25:14 字數 1709 閱讀 9481

依據前序遍歷序列和中序序列重構二叉樹

前序遍歷:1,2,3,4,5,6,7

中序遍歷:3,2,4,1,6,5,7

首先分析前序遍歷和中序遍歷序列的特點:

前序遍歷:遍歷的第乙個為根節點

中序遍歷:以根節點為分隔,根節點之前的全部為左子樹,根節點之後的全部為右子樹

依據這兩個性質,要重建二叉樹的話,我們就是先找到根節點,然後再分別找出它的左右子樹,然後再分別以左右孩子為根節點,確定它的左右孩子

我們可以運用遞迴的思想來解決此題

下邊是**:

#include#includeusing namespace std;

struct binarytreenode

;binarytreenode* _rebuildtree(int* startprev,int* endprev,int* startin,int* endin)

else

}//在中序遍歷中找根節點的值

int* rootin = startin;

while (rootin <= endin && *rootin != rootvalue)

if (rootin == endin && *rootin != rootvalue)//在中序遍歷中沒有找到的情況

int leftlength = rootin - startin;

int* leftprevend = startprev + leftlength;

if (leftlength > 0) //遞迴構建左子樹

if (leftlength < endprev - startprev)//遞迴構建右子樹

return root;

}binarytreenode* rebuildtree(int* prev, int* in, int len)

return _rebuildtree(prev, prev + len - 1, in, in + len + -1);

}void preorder(binarytreenode* root)

void postorder(binarytreenode* root)

void rebuildtreetest()

; int in = ;

binarytreenode* ret = rebuildtree(prev, in, 7);

cout << "前序遍歷: ";

preorder(ret);

cout << endl;

cout << "後序遍歷: ";

postorder(ret);

cout << endl;

}int main()

這個**關鍵之處是在於遞迴時函式傳參問題,下邊給出幫助理解。

下邊是執行結果截圖,為了檢驗其正確性,可以用後序遍歷和監視視窗來檢驗。

根據前序遍歷序列和中序遍歷序列重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。程式設計思路 1.先求出根節點 前序序列第乙個元素 2.將根節點帶入到中序遍歷序列中求出左右子樹的中序遍歷序列。3.通過左...

如何根據前序遍歷序列和中序遍歷序列確定二叉樹

分段,每一段找根節點,就好,找root,有點遞迴的思路。例如 假設某二叉樹的先序遍歷序列是abdgcefh,中序遍歷序列是dgbaechf,畫出二叉樹,並給出其後序遍歷序列.以下面的例題為例進行講 已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh dgbaechf,求二叉樹及後序遍歷...

根據前序遍歷和中序遍歷重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class treenode public class s2 public treenode reconstruct int pre...