題目:
輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重複的數字。
例如,前序遍歷序列:{1,2,4,7,3,5,6,8},中序遍歷序列:{4,7,2,1,5,3,8,6}
則重建出的二叉樹如下所示,並輸出它的頭結點1。
基本思想:
前序遍歷:
前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。
中序遍歷:
中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。在遍歷左、右子樹時,仍然先遍歷左子樹,再訪問根結點,最後遍歷右子樹。
1、先序遍歷序列的第乙個元素必定是根節點,可以由此獲取二叉樹的根節點。
2、根據根節點,在中序遍歷序列中查詢該節點,由中序遍歷的性質可知,中序遍歷中該根節點左邊的序列必定在根節點的左子樹中,而根節點右邊的序列必定在右子樹中。由此可以知道先序遍歷中左子樹以及右子樹的起止位置。
3、分別對左子樹和右子樹重複上述的過程,直至所有的子樹的起止位置相等時,說明已經到達葉子節點,遍歷完畢。
//二叉樹結點定義
typedef struct bitreenodebitreenode,*bitree;
//訪問函式
void visit(bitree t)
//先序遍歷
void preorder(bitree t)
} //中序遍歷
void inorder(bitree t) }
//後序遍歷
void postorder(bitree t) }
bitree constructor(int * startp,int * endp,int * starti,int * endi)
//在中序遍歷中找到根節點的值
int * rooti=starti;
while(rooti<=endi && *rooti!=rootvalue)
++rooti;
if(rooti==endi && *rooti!=rootvalue)
return null;
int leftlen=rooti-starti;
int *leftpe=startp+leftlen;
if(leftlen>0)
if(leftlenrchild=constructor(leftpe+1,endp,rooti+1,endi);
} return root;
} bitree foo(int * pre,int * ino,int len)
void main()
;int ino=;
int len=sizeof(pre)/sizeof(pre[0]);
bitree t = foo(pre,ino,len);
cout<
cout
劍指offer《面試題6 重建二叉樹》
題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出下圖所示的二叉樹並輸出它的頭結點。1 2 3 4 5 6 7 8 劍指offer 名企面試官精講典型程式設計題 著作權所有者 何海濤 inc...
劍指offer 面試題6重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。重建出二叉樹,並輸出根節點。二叉樹的定義如下 如上,前序遍歷 1,2,4,7,3,5,6,8,中序 4,7,2,1,5,3,8,6,後序遍歷 7,4,2,5,8,6,3,1 在二叉樹的前序...
劍指Offer 面試題6 重建二叉樹
題目 輸入某二叉樹的連續遍歷和後序遍歷結果,請重建此二叉樹.輸出它的頭結點.假設輸入的前序遍歷和後序遍歷結果中都不含重複數字 分析 public class solution 構造出二叉樹的方法 param pre 子樹的前序遍歷陣列 param startpre 子樹的前序遍歷陣列第乙個數在pre...