《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表
具体的题目大意和参考思路在此处不详述(见《剑指offer》),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法。
方法1(递归法):
代码如下:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr)
return nullptr;
TreeNode * pre = nullptr;//中序遍历中当前节点的前一个节点
ConvertCore(pRootOfTree,pre);
TreeNode * rs = pRootOfTree;
while(rs->left != nullptr)//经过转换后的pRootOfTree已经指到双向链表的末端
rs = rs->left;
return rs;
}
void ConvertCore(TreeNode *cur ,TreeNode * &pre)
{
if(cur == nullptr)
return;
ConvertCore(cur->left,pre);
cur->left = pre;
if(pre != nullptr)
pre->right = cur;
pre = cur;
ConvertCore(cur->right,pre);
}
};
关于递归法此处有几点需要注意:
1.实际整个过程中需要记录的节点只有一个:即在遍历过程中当前节点的前一个节点。在ConvertCore方法中,if(pre != nullptr)这一步是必须要加的,实际上是用来判断初始化时的情况。(pre初始化时为nullptr)
2.节点的left指针指向前一个节点,right指针指向后一个节点;最后返回的是rs这个指针(必须是链表的头指针)。
3.ConvertCore中的第二个参数为指针的引用,当然此处也可以是指向指针的指针即二级指针。因为函数中要操作的是指针变量本身,而不是指针变量指向的值。本题按情况类似于http://www.cnblogs.com/wangkundentisy/p/8586248.html
方法2(非递归):
代码如下:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr)
return nullptr;
TreeNode * pre = nullptr;//中序遍历中当前节点的前一个节点
ConvertCore(pRootOfTree,pre);
TreeNode * rs = pRootOfTree;
while(rs->left != nullptr)//经过转换后的pRootOfTree已经指到双向链表的末端
rs = rs->left;
return rs;
}
void ConvertCore(TreeNode *cur ,TreeNode * &pre)
{
if(cur == nullptr)
return;
stack<TreeNode*>s;
TreeNode *p = cur;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->left;
}
else
{
p = s.top();
s.pop();
p->left = pre;
if(pre != nullptr)
pre->right = p;
pre = p;
p = p->right;
}
}
}
};
关于非递归,感觉直接套模板,然后改改细节就能实现了,还是需要注意的一点就是if(pre != nullptr)这个判断不要忘记加。
总之,这种涉及指针的递归类问题很容易出错,一定要搞清楚整个逻辑过程,写完代码后,在心中照着代码执行一遍看看有没有出错。
《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表的更多相关文章
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- 剑指offer 面试题36.二叉搜索树与双向链表
中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...
- 《剑指offer》面试题36. 二叉搜索树与双向链表
问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 《剑指offer 第二版》题解
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...
- 剑指offer第二版速查表
3.数组中重复数字:每个位置放置数字与下标对应相等 O(n) 4.二维数组中的查找:右下角开始比较 O(m+n) 5.替换空格:python直接替换 6.从尾到头打印链表: 借助栈或直接利用系统调用栈 ...
- 剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...
- 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树
剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...
随机推荐
- Html静态网页下载—Teleport Pro 1.68 官方原版
Teleport Pro 1.68 官方原版+有效注册码 – 下载整个网站 简介 Teleport Pro由美国Tennyson Maxwell公司开发,曾被PC Magazine评为”编辑选择奖”. ...
- 使用kcptun安全代理访问服务
KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果. KCP:https://github.com/skywind ...
- Unity3D UGUI下拉菜单/Dropdown组件用法、总结
Unity3D中UGUI实现下拉菜单 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- Automatic Text Difficulty Classifier Assisting the Selection Of Adequate Reading Materials For European Portuguese Teaching --paper
the system uses existing Natural Language Processing (NLP) tools, a parser and an hyphenator, and tw ...
- 51Nod 1240:莫比乌斯函数
1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使 ...
- linux报错jar包时出现“Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
linux安装zip命令: yum install zip zip -d demo.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF
- CentOS右键菜单添加新增文件命令
进入模板文件夹, 增加空白文件即可. cd /home/tom/Templatesvi text01.txt //新增一个名为text01的文本文件. :wq //保存退出. 另外可以用LibreOf ...
- (8)视图层参数request详解
PS:浏览器页面请求的都是get请求 PS:post请求是通过form表单,阿贾克斯发 request里面的常用方法 def index(request): print(request.META) # ...
- hdu2461 Rectangles 线段树--扫描线
You are developing a software for painting rectangles on the screen. The software supports drawing s ...
- day 46 html 学习 列 表格,
列表 1.无序列表 <ul type="disc"> <li>第一项</li> <li>第二项</li> </ul ...