思路:先根據先序序列第乙個數建立根節點,然後再中序序列中找到根節點的位置,進而確定左右子樹的前序序列和後序序列,遞迴的構建左右子樹。
c++**:
#include "stdafx.h"
#include #include using namespace std;
struct bitreenode
;bitreenode* createbitreebypreorderandinorder(int* preorder, int nprestart, int npreend,
int* inorder, int ninstart, int ninend)
//根據先序序列找到根結點
int nrootdate = preorder[nprestart];
//在中序序列中找到根結點
int ncount = 0;
int ncur = 0;
for (ncur=ninstart; ncur<=ninend; ncur++)
else
}assert(ncur >= ninstart && ncur <= ninend);
//建立結點
bitreenode* proot = new bitreenode;
proot->m_ndata = nrootdate;
//根據中序序列,劃分兩個序列,遞迴處理。
proot->m_pleftchild = createbitreebypreorderandinorder(preorder,nprestart + 1,nprestart + ncount
,inorder,ninstart,ninstart + ncount - 1);
proot->m_prightchild = createbitreebypreorderandinorder(preorder,nprestart + ncount + 1,npreend
,inorder,ninstart + ncount + 1,ninend);
return proot;
}//根據二叉樹的前序遍歷序列和後序遍歷序列重建二叉樹
bitreenode * createbitreebypreorderandinorder(int *preorder, int *inorder, int nlength)
else }
void preorderprint(bitreenode *proot) }
void inorderprint(bitreenode *proot) }
int _tmain(int argc, _tchar* argv)
; int ninorderarr[8] = ;
bitreenode *proot = createbitreebypreorderandinorder(npreorderarr, ninorderarr,8);
cout << "先序序列:";
preorderprint(proot);
cout << endl;
cout << "後序序列:";
inorderprint(proot);
cout << endl;
system("pause");
return 0;
}
面試題6 重建二叉樹
面試題6 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,重建出該二叉樹。不包含重複數字。前序遍歷的第乙個結果就是根節點,中序遍歷中根節點前面的節點就是左子樹,後面的節點就是右子樹。然後遞迴的構建左右子樹。binarytreenode constructbinarynode int startpreo...
面試題6 重建二叉樹
templatestruct binarytreenode 對比二叉樹的圖形和其兩個遍歷序列來看,可以發現在前序遍歷序列中第乙個數字總是二叉樹的根節點的值,然後在中序遍歷序列中找到該值,它的前面就是它左子樹上節點值的集合,後面就是它右子樹上節點值的集合。由此就可以遞迴地在這兩個集合中建立二叉樹。bi...
面試題6 重建二叉樹
二叉樹中最重要的操作莫過於遍歷,即按照某一順序訪問樹中的所有結點。以下這三種遍歷都有遞迴和迴圈兩種實現方法,每一種遍歷的遞迴都要比迴圈實現簡潔地多。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。遞迴實現 void preo...