1 題目及要求
1.1 題目描述
把一個二叉樹轉化爲鏈表(單雙向都可以)。
2 解答
2.1 代碼
#include <iostream>
using namespace std;
// 樹的結構
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
//********************************************************//
// 帶有哨兵的實現, dump後面(.right->)接着要求的鏈表
TreeNode* treeToList1_dump(TreeNode *root, TreeNode &dump) {
if (!root) {
dump.right = nullptr;
return &dump;
}
TreeNode *np, *retp(root);
np = treeToList1_dump(root->right, dump);
if (root->right = dump.right) retp = np;
np = treeToList1_dump(root->left, dump);
np->right = root;
root->left = nullptr; // root->left = np; // 雙向鏈表
return retp;
}
TreeNode* treeToList1_dump(TreeNode *root) {
TreeNode dump(0);
treeToList1_dump(root, dump);
return dump.right;
}
//********************************************************//
// 單鏈表實現, 修改註釋處也可以改爲雙鏈表
void treeToList1(TreeNode *root, TreeNode **head, TreeNode **tail) {
if (root->left) {
treeToList1(root->left, head, tail);
(*tail)->right = root;
root->left = nullptr;
//root->left = *tail; // 雙鏈表
}
else {
*head = root;
}
if (root->right) {
TreeNode *np;
treeToList1(root->right, &np, tail);
root->right = np;
//np->left = root; // 雙鏈表
}
else {
*tail = root;
}
}
TreeNode* treeToList1(TreeNode *root) {
if (!root) return root;
TreeNode *head(nullptr), *tail(nullptr);
treeToList1(root, &head, &tail);
return head;
}
//********************************************************//
// 循環雙鏈表實現
int connect(TreeNode *p1, TreeNode *p2) { // 連接兩個環形鏈表
if (!(p1 && p2)) return -1;
p2->left->right = p1->right;
p1->right->left = p2->left;
p1->right = p2;
p2->left = p1;
return 0;
}
TreeNode* treeToList2_m(TreeNode *root) { // 轉化爲環形鏈表, 並返回首元素指針
if (!root) return root;
TreeNode *np(root), *lp(root->left), *rp(root->right);
root->left = root->right = root;
if (lp) connect((np = treeToList2_m(lp))->left, root);
if (rp) connect(root, treeToList2_m(rp));
return np;
}
TreeNode* treeToList2(TreeNode *root) { // 斷開環形鏈表, 並返回首元素指針
if (!root) return root;
root = treeToList2_m(root);
root->left->right = nullptr;
root->left = nullptr;
return root;
}
int main() {
TreeNode t[] = { 0,1,2,3,4,5,6 };
t[3].left = t + 1; t[3].right = t + 5;
t[1].left = t; t[1].right = t + 2;
t[5].left = t + 4; t[5].right = t + 6;
auto np = treeToList1_dump(t + 3);
for (auto np1(np);np1;np1 = np1->right) cout << np1->val << ' ';
cout << endl;
t[3].left = t + 1; t[3].right = t + 5;
t[1].left = t; t[1].right = t + 2;
t[5].left = t + 4; t[5].right = t + 6;
t[0].left = t[0].right = t[2].left = t[2].right = nullptr;
t[4].left = t[4].right = t[6].left = t[6].right = nullptr;
np = treeToList1(t + 3);
for (auto np1(np);np1;np1 = np1->right) cout << np1->val << ' ';
cout << endl;
t[3].left = t + 1; t[3].right = t + 5;
t[1].left = t; t[1].right = t + 2;
t[5].left = t + 4; t[5].right = t + 6;
t[0].left = t[0].right = t[2].left = t[2].right = nullptr;
t[4].left = t[4].right = t[6].left = t[6].right = nullptr;
np = treeToList2(t + 3);
for (auto np1(np);np1;np1 = np1->right) cout << np1->val << ' ';
cout << endl;
return 0;
}