1
/ \
2 3
/ \ / \
4 5 6 7
對於上圖的樹來說,
index: 0 1 2 3 4 5 6
先序遍歷為: 1 2 4 5 3 6 7
中序遍歷為: 4 2 5 1 6 3 7
1. 先序遍歷的第乙個節點為根節點。
2. 中序遍歷中根節點是左子樹右子樹的分割點。
所以這道題可以用遞迴的方法解決。
通過先序遍歷找到第乙個點作為根節點,在中序遍歷中找到根節點並記錄index。此處用hashmap來儲存, key為中序遍歷節點值 value為index
因為中序遍歷中根節點左邊為左子樹,所以可以記錄左子樹的長度並在先序遍歷中依據這個長度找到左子樹的區間,用同樣方法可以找到右子樹的區間。
遞迴的建立好左子樹和右子樹就好。
時間o(n) 空間用了乙個map 為o(n)
public treenode buildtree(int preorder, int inorder)
int len = preorder.length;
hashmapmap = new hashmap();
for (int i = 0; i < len; i++)
return helper(preorder, 0 , len - 1, inorder, 0, len - 1, map);
}public treenode helper(int preorder, int pstart, int pend, int inorder, int istart, int iend, hashmapmap)
treenode root = new treenode(preorder[pstart]);
int index = map.get(root.val);
root.left = helper(preorder, pstart + 1, pstart + index - istart, inorder, istart, index - 1, map);
root.right = helper(preorder, pstart + index - istart + 1, pend, inorder, index + 1, iend, map);
return root;
}
時間o(n) 空間用了乙個map 為o(n)
public treenode buildtree(int inorder, int postorder)
return helper(inorder, 0, len - 1, postorder, 0 , len - 1, map);
}public treenode helper(int inorder, int istart, int iend, int postorder, int pstart, int pend, hashmapmap)
treenode root = new treenode(postorder[pend]);
int index = map.get(root.val);
root.left = helper(inorder, istart, index - 1, postorder, pstart, pstart + index - istart - 1, map);
root.right = helper(inorder, index + 1, iend, postorder, pstart + index - istart, pend - 1, map);
return root;
}
線段樹構造
線段樹是一棵二叉樹,他的每個節點包含了兩個額外的屬性start和end用於表示該節點所代表的區間。start和end都是整數,並按照如下的方式賦值 實現乙個build方法,接受 start 和 end 作為引數,然後構造乙個代表區間 start,end 的線段樹,返回這棵線段樹的根。您在真實的面試中...
Java 樹的構造演算法
class uf 將所有連通觸點指向最後的觸點 int find int p void union int p,int q for int i 0 i id.length i boolean connection int p,int q int count class uf1 查詢觸點的根觸點,類似...
Huffman樹的構造原理
在編碼過程中,人們需要盡可能的提高編碼效率。例如,對於26個字母的編碼,可以輕易地用五位二進位制數來編碼。然而,這樣做會造成很大的空間浪費。於是不難想到,用1 5位二進位制數來編碼這26個字母。可是,這樣的編碼存在二義性。如,將a編碼為0,b編碼為01,c編碼為00,d編碼為1,對於 0001 這樣...