面試OR筆試12——二叉樹轉化爲鏈表

題目及要求

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;
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章