面试OR笔试12——二叉树转化为链表

61 篇文章 0 订阅
61 篇文章 0 订阅

题目及要求

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值