《剑指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 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...
随机推荐
- JavaBasic_09
方法的参数传递 方法调用时参数值的传递可以分为"值传递"和"引用传递"两种 值传递 - a.当方法的参数为基本数据类型时 b.实参的值被复制给形参,改变形参不会 ...
- AE旋转
精准对位: 好几个图层上的旋转点在一个位置上: 方法1:勾选网格,定点. 方法2:按住ctrl+r 调出尺寸.拖参考线,焦点自动吸附功能. 选中四张或者选中第一张,按shift键,选中最后一张(即可 ...
- CCF-棋局评估 201803-04(版本 2.0)------(之前写了一个臃肿的1.0版 ,还沾沾自喜 233)
核心 : 博弈搜索树 双方得分互为相反数 dfs (x,y,player): 玩家player下完(x,y)之后的得分最大值 易错: 先判断输赢,再判断平局 待改进: check() 函数写的 ...
- NYOJ 85:有趣的数(打表,规律)
85-有趣的数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:12 难度:2 题目描述: 把分数按下面的办法排成一个数表. 1/1 1/2 1/3 1/4- 2/1 2 ...
- acm 2044
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- 浅谈log4j-4-不同目的地(转)
public class DifferentAppender { private static Logger logger=Logger.getLogger(DifferentAppender.cla ...
- ios 上浏览器返回上一页不会刷新页面问题,页面初始化的方法不执行
https://blog.csdn.net/yang450712123/article/details/79276102 https://blog.csdn.net/Chengbin_Huang/ar ...
- LeetCode - Trim a Binary Search Tree
Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...
- centos Cannot allocate memory for the buffer pool
mysql 无法启动 ,查看日志: --01T15::.401599Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. P ...
- deno学习四 docker 运行官方的一个http file server
github 上已经有人搞了一个deno 的docker 镜像,是基于源码编译的,挺好的 所以结合官方的http server demo 使用docker 运行 环境准备 docker-compose ...