上次的這篇文章二叉樹的構造(一)實現了根據一棵二叉樹的後序序列和中序序列來構造出這顆二叉樹,我們採取結構體形式構建二叉樹,這次我們根據先序和中序序列來構建這個二叉樹,寫這篇主要是因為之前的**感覺還是沒有理解到位,因此補上。
開始構建二叉樹的時候我們需要明確幾個問題:
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...