我有一個存儲在數組中的二叉樹的預遍歷,我想重新創建基於此遍歷的二叉樹。我的數組看起來像這樣:{NNNLLNLLNLNLNNLLNLL},其中N代表節點,L代表葉。我想遞歸地做到這一點,但我有麻煩提出一個算法。任何建議將非常感激。從給定的預先遍歷構建二叉樹
0
A
回答
0
在重建樹之前,您還需要再進行一次遍歷。鑑於三個(Pre,Post,In)之間的任何兩次遍歷,您可以重建。但只有一個,不可能唯一地重構樹。
+0
你是對的,除非它是一個嚴格的二叉樹,在這種情況下,可以用我提供的算法重構(唯一)樹。 – LeartS
+0
當然。爲你的答案+1了 –
2
這應該假設每個節點都有2個或0後代
void create_from_traversal(Node* root, int& index) {
if (traversal[index] == 'L') {
root->left = root->right = NULL;
return;
}
root->left = new Node();
create_from_traversal(root->left, ++index);
root->right = new Node();
create_from_traversal(root->right, ++index);
}
與檢查完成例子(滿足該屬性被稱爲全或嚴格二叉樹樹):
#include <string>
#include <iostream>
class Node {
public:
Node* left;
Node* right;
};
std::string traversal = "NNNLLNLLNLNLNNLLNLL";
void create_from_traversal(Node* root, int& index) {
if (traversal[index] == 'L') {
root->left = root->right = NULL;
return;
}
root->left = new Node();
create_from_traversal(root->left, ++index);
root->right = new Node();
create_from_traversal(root->right, ++index);
}
void print_traversal(Node* root) {
if (root->left == NULL) {
std::cout << "L";
return;
}
std::cout << "N";
print_traversal(root->left);
print_traversal(root->right);
}
int main() {
Node* root = new Node();
int index = 0;
create_from_traversal(root, index);
// Does it work?
print_traversal(root); // Output should be equal to given traversal
std::cout << std::endl;
}
輸出:
NNNLLNLLNLNLNNLLNLL
+0
這段代碼通過了我給出的右權重樹NLNNNLLLL的例子。 –
相關問題
- 1. 從預先遍歷構建二叉樹:堆棧溢出錯誤
- 2. 建立二叉樹出給定遍歷
- 3. 構建二叉搜索樹從預遍歷迭代(不遞歸)
- 4. 二叉樹遍歷
- 5. 二叉樹遍歷
- 6. 遍歷二叉樹
- 7. 遍歷二叉樹
- 8. 二叉搜索樹遍歷 - 預購
- 9. 二叉樹,返回預先遍歷中的下一個節點
- 10. 使用預先遍歷在Java中複製二叉樹
- 11. 預先遍歷二叉樹。如果vs而
- 12. 如何從給定的遍歷中找到二叉樹?
- 13. 二叉搜索樹給定樹的前,後,後順序遍歷
- 14. 二叉樹級別遍歷
- 15. 二叉樹遍歷抽象
- 16. 二叉搜索樹遍歷
- 17. 遍歷二叉搜索樹
- 18. 爲了遍歷二叉樹
- 19. 二叉搜索樹遍歷
- 20. 遍歷非二叉樹
- 21. 遍歷二叉搜索樹
- 22. Javascript:遍歷二叉樹?
- 23. 二叉樹級別遍歷
- 24. SQL二叉樹遍歷
- 25. 遞歸遍歷二叉樹
- 26. Python:二叉樹類:用遍歷重建
- 27. 從預置位bitstring構建二叉樹
- 28. 從指令缺席兒童的預訂遍歷的二叉樹
- 29. 在樹中遍歷二叉樹C
- 30. 使用給定的遍歷驗證二叉樹
一個重要的問題: 爲什麼你需要它以特定的順序存儲在二叉樹?它是什麼樣的數據? –
這是一個huffman編碼樹。 – Kalmar