面試題5 重建二叉樹

2021-06-16 17:41:54 字數 1729 閱讀 2194

思路:先根據先序序列第乙個數建立根節點,然後再中序序列中找到根節點的位置,進而確定左右子樹的前序序列和後序序列,遞迴的構建左右子樹。

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