二叉樹的構造(二)

2021-07-11 13:34:51 字數 1262 閱讀 6824

上次的這篇文章二叉樹的構造(一)實現了根據一棵二叉樹的後序序列和中序序列來構造出這顆二叉樹,我們採取結構體形式構建二叉樹,這次我們根據先序和中序序列來構建這個二叉樹,寫這篇主要是因為之前的**感覺還是沒有理解到位,因此補上。

開始構建二叉樹的時候我們需要明確幾個問題:

1. 採用什麼方式進行構建?

2. 構建時候如何利用先序和中序序列?

根據我們遍歷二叉樹的規則,我們採取遞迴的方式構建整個二叉樹。因為中序序列很好地將樹根放在中間然後左右子樹在兩邊,因此我們的演算法大體思路就有了:根據先序得到根,然後在中序序列找到根,這樣一棵樹的根節點就建立了,這時候我們把上面的步驟看成整體,遞迴建立左右子樹即可。

這裡我們採用和(一)中一樣的函式(我覺得這個函式挺好理解的):

tpoint buildtree(char* preorder,char* inorder,int length)

//preorder是當前子樹的前序序列

//inorder是當前子樹中序序列

//length是當前需要建立的子樹的序列長度

根據演算法思想,首先得到根,在當前(寫遞迴的時候考慮當前)我們的根(root)一定是前序序列的第乙個,這時候建立樹節點,把root內容放進去,然後將根在中序序列中搜尋這個根,記錄這個rootidx(根的序號,後面非常有用)。

遞迴建立左右子樹,這個容易弄錯。建立左右子樹的時候需要利用到左右子樹的前序和中序序列,我們分別說明:

(1)左子樹

(2)右子樹

最後我們需要說明的是遞迴邊界條件,當length為0的時候說明當前根沒有左子樹或者右子樹,這時候返回null即可。

這時候放**應該沒問題:

#include 

#include

#include

#include

#include

using

namespace

std;

struct tnode;

typedef tnode* tpoint;

tpoint buildtree(char* preorder,char* inorder,int length)

void postorder(tpoint t)

}char preorder[27];

char inorder[27];

int main()

return

0;}

這下對於二叉樹又有了進一步的理解和認識,如果有什麼問題歡迎指出。

二叉樹構造

題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。public int findvalptr vectorarr,int val return i 查詢子樹的根節點 publi...

構造二叉樹

題目 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 理解從前序中可以直接找到根節點,然後從中序中找到這個根節點並...

構造二叉樹

例 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 二叉樹 3 9 20 15 7 definition for a binary tree node.struct treenode class solution treenode buildtr...