程序员面试金典——17.13树转链表
在《剑指offer》上有一个类似的题目:https://blog.csdn.net/allenlzcoder/article/details/79612488
参考网址:https://www.nowcoder.com/profile/3883678/codeBookDetail?submissionId=11971240
说实话,这三种解法的代码理解起来都不是很直观,要多看、勤想~
Solution1:
思路:递归
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Converter {
public:
ListNode* treeToList(TreeNode* root) {
// write code here
if (root == NULL)
return NULL;
ListNode* left = treeToList(root->left);
ListNode* right = treeToList(root->right);
ListNode* mid = new ListNode(root->val);
mid->next = right;
if (left != NULL){
ListNode* tmp = left;
while (tmp->next){ //必须把tmp定位到最后一个结点上
tmp = tmp->next;
}
tmp->next = mid;
}
delete root;
return left != NULL? left : mid;
}
};
Solution2【推荐写法】:递归的另一种写法
这种递归得好好理解一下~递归的返回值未必总是有用的,再此方法中起到串联作用的是指针q
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Converter {
private: ListNode* head = new ListNode(-1);
private: ListNode* q = head;
public: ListNode* treeToList(TreeNode* root) {
// write code here
if(root != NULL) {
treeToList(root->left);
q->next = new ListNode(root->val);//q的这两行代码最关键
q=q->next;
treeToList(root->right);
}
return head->next;//每次的返回值未必都是有用的
}
};
Solution3:
思路:迭代
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Converter {
public:
ListNode* treeToList(TreeNode* root) {
// write code here
if (root == NULL)
return NULL;
struct ListNode* dummy = new ListNode(0);
struct ListNode* tail = dummy;
stack<TreeNode*> treenode_stack;
while (root != NULL || !treenode_stack.empty()) {
while (root != NULL) {
treenode_stack.push(root);
root = root->left;
}
root = treenode_stack.top();
treenode_stack.pop();
tail->next = new ListNode(root->val);
tail = tail->next;
root = root->right;
}
return dummy->next;
}
};