【重点】程序员面试金典——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;
    }
};
### Visual Studio 17.13.0 版本特性 Visual Studio 17.13.0 提供了一系列新特性和改进,旨在提升开发效率和用户体验。此版本增强了对多种编程语言的支持,并引入了一些新的工具和服务。 - **性能优化**:显著提高了启动速度以及大型项目中的编辑体验。 - **调试器增强**:增加了更强大的断点设置选项和支持异步方法调用栈可视化[^1]。 - **Live Share 改进**:允许开发者实时协作编码并共享终端会话。 - **Azure 集成加强**:简化云端资源管理和部署流程。 - **C++ 和 .NET 开发支持**:提供了更好的 IntelliSense 功能和其他生产力辅助功能。 ### 安装指南 为了顺利安装 Visual Studio 17.13.0,请遵循以下指导: #### 准备工作 确保计算机满足最低硬件要求,并关闭所有正在运行的应用程序以减少潜在冲突。 #### 下载与执行安装文件 访问官方网站获取最新版的安装程序,并按照提示完成下载过程。双击.exe 文件启动图形化向导界面。 #### 自定义组件选择 在安装过程中可以选择所需的工作负载(Workloads),这些预配置好的集合包含了特定领域所需的全部工具集。对于大多数用户而言,默认推荐的选择已经足够全面;但对于有特殊需求的情况,则可以根据实际情况调整勾选项。 #### 更新现有实例 如果之前已有旧版本存在,在安装时会被自动检测到,并提供升级路径来保留自定义设置和个人资料。 ```bash # 如果遇到权限不足的问题可以尝试管理员模式重新打开命令行窗口再试一次 vs_installer modify --installPath "C:\Program Files (x86)\Microsoft Visual Studio\2022\Community" ``` ### 常见问题解决方案 针对可能出现的一些型难题给出相应对策如下: - **无法加载某些扩展插件** 这可能是由于兼容性问题引起的。可以通过禁用不必要的附加组件或者回滚至稳定版本的方式解决问题。另外也可以查看官方论坛是否有其他用户的相似反馈及其处理办法。 - **编译报错但无具体提示信息** 尝试清理解决方案(`Build -> Clean Solution`)后再重建整个工程(`Rebuild All`)。同时确认所有的依赖库都已经被正确引用并且版本匹配。 - **更新后原有配置丢失** 当进行大版本迭代之后确实有可能会出现这种情况。建议提前做好备份措施,比如导出当前IDE的各项参数设定以便日后恢复使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值