T105 根據先序和中序序列構建二叉樹

2021-10-05 04:56:33 字數 1405 閱讀 5932

思想:借助分治思想,時間複雜度o(nlogn),空間複雜度為o(logn)

時間複雜度計算利用master定理:

t(n) = 2t(n/2)+ n

借助先序序列構建當前根結點root,然後再借助中序序列去求root的左和右孩子在先序序列中的位置,這也是這題得到巧妙之處

怎麼求?

1、這裡根據先序序列的特性,其左孩子必為先序序列中根節點的下乙個位置上的結點

2、那麼右孩子呢?可以這麼考慮:先序序列遍歷順序為:根->左->右,那你要早右孩子在先序序列中的位置,可以先求出根結點的左子樹右多少個結點,假設有m個.然後右孩子對應的下標即為當前根結點在先序序列中的下標+m.(prestart+rootidx-instart+1)

那麼怎麼求這個m呢?借助中序遍歷的特性:左->根->右,所以只要找出根結點在中序序列中的下標然後減去中序序列的起始下標+1即為其左子樹有多少個結點(m=rootidx-instart+1

class solution 

treenode root = new treenode(preorder[pstart]);

int rootidxininorder = istart;

//先找到根節點在中序序列中的位置

// 由於這裡要去遍歷中序遍歷導致時間複雜度變為o(nlogn),所以要改進時間複雜度就從這裡入手,借助乙個map來儲存中序遍歷序列中每個下標對應的節點所在的位置

while(rootidxininorder【改進型】:

借助乙個map來儲存中序遍歷序列中每個下標對應的節點所在的位置,避免再遞迴時再去遍歷中序序列去找到root在中序序列中的位置

時間複雜度o(n) ,空間複雜度o(n)

t(n) = 2t(n/2) +o(1)

class solution

if(instart==inend)

treenode root = new treenode(preorder[pstart]);

int idx = map.get(preorder[pstart]);

root.left = helper(preorder, pstart+1, inorder, instart, idx-1,map);

root.right = helper(preorder, pstart+(idx-instart+1), inorder, idx+1, inend,map);

return root;

}public treenode buildtree(int preorder, int inorder)

mapmap = new hashmap<>();

for(int i=0;ireturn helper(preorder,0,inorder,0,ilen-1,map);

}}

7 1 根據後序和中序遍歷輸出先序遍歷(25 分)

題目鏈結 本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。第一行給出正整數 n 是樹中結點的個數。隨後兩行,每行給出 n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。在一行中輸出preorder 以及該樹的先序遍歷結果。數字間...

7 7 根據後序和中序遍歷輸出先序遍歷 25分

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。輸入格式 第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。輸出格式 在一行中輸出preorder 以及該樹的先序遍歷...

7 3 根據後序和中序遍歷輸出先序遍歷 25分

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。輸入格式 第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。輸出格式 在一行中輸出preorder 以及該樹的先序遍歷...