二叉樹 前中後序兩兩結合構建二叉樹

2022-07-30 10:00:13 字數 2168 閱讀 2926

你可以假設樹中沒有重複的元素。這句話代表什麼呢?

這樣可以保證結點的數值可以在中序遍歷陣列中唯一確定,這樣還原出的二叉樹是唯一確定的

根據(先序+中序)或者(中序+後序)可以唯一確定二叉樹,根據(先序+後序)無法唯一確定二叉樹,但是如果一棵二叉樹除了葉子結點外,其他所有結點都有左子和右子,這樣的樹可以根據(先序+後序)唯一確定。

先序陣列中最左邊的值就是樹的根節點的值,記為h,並用h生成頭節點,記為head。然後在中序陣列找到h,設位置為i。在中序陣列中,i左邊的陣列就是頭節點左子樹的中序陣列,假設長度為l,則左子樹的先序陣列就是先序陣列中h往右長度為l的陣列。

用左子樹的先序和中序陣列,遞迴構建左子樹,返回的頭節點為left

i右邊的陣列就是頭節點右子樹的中序陣列,假設長度為r。先序陣列中右側等長的部分就是頭節點右子樹的先序陣列

用右子樹的先序和中序陣列,遞迴構建右子樹,返回的右節點記為right

將head的左子,右子設為left,right,返回head,過程結束。

在中序陣列中找到位置i可以用雜湊表實現。

時間複雜度:o(n)

空間複雜度:o(n)

public treenode buildtree(int preorder, int inorder) 

mapmap = new hashmap<>();

for (int i = 0; i < inlen; i++)

return helper(preorder, 0, prelen - 1, inorder, 0, inlen - 1, map);

}public treenode helper(int preorder, int preleft, int preright,

int inorder, int inleft, int inright,

mapmap)

int rootval = preorder[preleft];

treenode root = new treenode(rootval);

int index = map.get(rootval);

root.left = helper(preorder, preleft + 1, index - inleft + preleft,

inorder, inleft, index - 1, map);

root.right = helper(preorder, index - inleft + preleft + 1, preright,

inorder, index + 1, inright, map);

return root;

}

和第一種類似,後序陣列中頭節點是後序陣列最右的值,用後序最右的值劃分中序陣列即可。時空間複雜度也和之前的一樣。

public treenode buildtree(int inorder, int postorder) 

mapmap = new hashmap<> ();

for (int i = 0; i < inlen; i++)

return helper(inorder, 0, inlen - 1, postorder, 0, poslen - 1, map);

}public treenode helper(int inorder, int inleft, int inright,

int postorder, int postleft, int postright,

mapmap)

int rootval = postorder[postright];

treenode root = new treenode(rootval);

int index = map.get(rootval);

root.left = helper(inorder, inleft, index - 1,

postorder, postleft, postleft + index - inleft - 1,

map);

root.right = helper(inorder, index + 1, inright,

postorder, postleft + index - inleft, postright - 1,

map);

return root;

}

待施工

先序中序後序兩兩結合重建二叉樹

遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為乙個線性序列來表示。設l d r分別表示遍歷左子樹 訪問根結點和遍歷右子樹,則對一棵二叉樹的遍...

二叉樹前中後序演算法

includetypedef struct nodebitnode,bitree void createbitree bitree bitree void preorder bitree root inorder bitree root 中序遍歷二叉樹,root為指向二叉樹 或某一子樹 根結點的指標...

二叉樹前中後序整理

今天刷劍指offer,遇到一題關於二叉樹前中後序的,所以就想整理一下二叉樹前中後序的概念,內容是從別處複製的,不是原創,方便以後自己遺忘了複習用。那麼對上面這個樹進行前中後序遍歷,結果如下 前序遍歷 ab cde 中序遍歷 a b c d e 這裡符號有優先順序就在此處加上了括號 後序遍歷 ab c...