【重点】程序员面试金典——17.13树转链表

本文介绍将二叉树转换为链表的三种不同方法,包括递归和迭代方式。通过具体代码实现展示了每种解法的特点及串联节点的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员面试金典——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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值