博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode-453-将二叉树拆成链表
阅读量:5122 次
发布时间:2019-06-13

本文共 2480 字,大约阅读时间需要 8 分钟。

将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。

注意事项

不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。

样例

901252-20170820170855756-195531908.png

挑战

不使用额外的空间耗费。

标签

二叉树 深度优先搜索

方法一

使用栈保存暂时无法插入到链表的节点

code

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /*     * @param root: a TreeNode, the root of the binary tree     * @return:      */    void flatten(TreeNode * root) {        // write your code here        if (root == NULL) {            return ;        }        stack
stack; TreeNode * node = root; bool isContinue = true; while (isContinue) { if (node->left != NULL && node->right != NULL) { stack.push(node->right); node->right = node->left; node->left = NULL; } else if (node->left != NULL && node->right == NULL) { node->right = node->left; node->left = NULL; } else if (node->left == NULL && node->right == NULL) { if (!stack.empty()) { node->right = stack.top(); stack.pop(); } else { isContinue = false; } } node = node->right; } }};

方法二

使用递归

code

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /*     * @param root: a TreeNode, the root of the binary tree     * @return:      */    void flatten(TreeNode * root) {        // write your code here        if (root == NULL) {            return;        }        switchToLink(root);    }    TreeNode* switchToLink(TreeNode* root) {        if (root == NULL) {            return NULL;        }        TreeNode* left = switchToLink(root->left);        TreeNode* right = switchToLink(root->right);        if (left != NULL) {            left->right = root->right;            root->right = root->left;        }        root->left = NULL;        if (right != NULL) {            return right;        }        else if (left != NULL) {            return left;        }        else {            return root;        }    }};

转载于:https://www.cnblogs.com/libaoquan/p/7400604.html

你可能感兴趣的文章
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>