依據前序遍歷序列和中序序列重構二叉樹
前序遍歷: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...