根據中序和先序 後序 構建二叉樹

2021-07-23 08:08:07 字數 2050 閱讀 7901

例:

前序遍歷: gdafemhz

中序遍歷: adefghmz

畫樹求法:

第一步,根據前序遍歷的特點,我們知道根結點為g

第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。

第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。

第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。

第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:

1 確定根,確定左子樹,確定右子樹。

2 在左子樹中遞迴。

3 在右子樹中遞迴。

4 列印當前根。

**如下:

/**

* 根據先序和中序 構建二叉樹

*@param pre

*@param in

*@return

*/public treenode reconstructbinarytree(int pre ,int in)

public treenode reconstructbinarytree(int pre,int prestart,int preend,int in,int instart,int inend)

treenode treenode =new treenode(pre[prestart]); //新建乙個treenode

for(int i=instart;i<=inend;i++)

}return treenode;

}

依然是上面的題,這次我們只給出中序和後序遍歷:

中序遍歷: adefghmz

後序遍歷: aefdhzmg

畫樹求法:

第一步,根據後序遍歷的特點,我們知道後序遍歷最後乙個結點即為根結點,即根結點為g。

第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。

第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。

第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前後序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。

第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:

1 確定根,確定左子樹,確定右子樹。

2 在左子樹中遞迴。

3 在右子樹中遞迴。

4 列印當前根。

這樣,我們就可以畫出二叉樹的形狀,如上圖所示,這裡就不再贅述。

那麼,前序遍歷: gdafemhz

/**

* 根據中序和後序 構建二叉樹

*@param in

*@param last

*@return

*/public treenode reconstructbinarytree2(int in,int last)

public treenode reconstructbinarytree2(int in,int instart,int inend,int last,int laststart,int lastend)

}return treenode;

}

二叉樹 先序 中序 後序

同學整理的,順便傳上分享下 一,已知先序和中序 求後序 1 include2 include3 include4 using namespace std 5char s1 10 s2 10 ans 10 6 int o 0 7 void tree int n char s1 char s2 char...

中序後序,中序先序求二叉樹

用後序,中序求二叉樹 includeusing namespace std int n int a 105 b 105 mapl,r int build int la,int ra,int lb,int rb 再在中序中找到這個數的位置 if i rb return root queueq void...

構造二叉樹 先序 中序 後序 中序

牛客網 給出一棵樹的前序遍歷和中序遍歷,請構造這顆二叉樹 注意 可以假設樹中不存在重複的節點 先遍歷的第乙個數是根節點,中序遍歷的根節點左邊是左子樹,右邊是右子樹。通過先序遍歷遍歷找到根結點,通過中序中根結點的位置可以將樹劃分成兩個子樹,然後遞迴的進行呼叫即可構造好二叉樹。definition fo...