劍指offer重建二叉樹

2021-09-25 17:03:12 字數 1050 閱讀 1691

題目描述:

輸入一棵二叉樹前序遍歷和中序遍歷的結果,請重建該二叉樹。

注意:二叉樹中每個節點的值都互不相同;

輸入的前序遍歷和中序遍歷一定合法;

樣例:給定:

前序遍歷是:[3, 9, 20, 15, 7]

中序遍歷是:[9, 3, 15, 20, 7]

返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]

返回的二叉樹如下所示:

做題思考:

1.考慮一下在前序遍歷找到最頂的根節點t1,是因為前序遍歷是根左右的順序。其次,中序遍歷是左根右,那麼在中序遍歷中最頂的根節點的左邊就是全部左子樹l1,右邊就是全部右子樹r1了。前序遍歷根節點後面的除去左子樹就是右子樹,在中序遍歷裡面找到根節點左邊就是左子樹。

按照這個方法迴圈往復故而遞迴。比如該題案例 20,15,7 是大根節點的右子樹(成為r1),那麼按照上述方法在前序遍歷找到右子樹r1下面的頂頭根節點t2為20,在中序遍歷裡找到右子樹r1下面的左子樹l2部分為20前面的,也就是15.剩下就是右子樹r1下面的右子樹r2為7.

注:其中快速找出大根結點可以用雜湊表

/**

class solution 

//以下為深度遍歷:

treenode* dfs(vector&pre, vector&in, int pl, int pr, int il, int ir)

};

總結:用到了前序遍歷和中序遍歷的特點,比如前序遍歷最左邊就是根節點,然後再在中序遍歷中確定了左右子樹。

其次利用遞迴深度遍歷後重新得出二叉樹。

其中在開頭判斷為空的條件是考慮利用二叉樹搜尋樹,左子樹的值小於根節點,右子樹的相反的特點。

最後,遍歷左右子樹的時候區間範圍需要格外留意。

最後對自己說:加油~ 一次不會看兩次,兩次不會多看幾次。看著看著敲著敲著就會啦。

劍指offer 重建二叉樹

重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...

《劍指offer》重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,則重建二叉樹並返回。輸入乙個樹的前序和中序,例如輸入前序遍歷序列和中序遍歷序列 根據輸入的前序和中序,重建乙個該二叉樹,並返回該樹的根節點。definition for binary...

劍指offer 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。definition for binary tree struct treenode class solution if ...