题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节点

  双向链表中每个节点都有一个prev指针指向前驱节点,一个next指针指向后继节点

  在二叉搜索树中,左节点小于父节点,右节点大于父节点;

  在排序双向链表中,前驱节点小于当前节点,后继节点大于当前节点

得到以下转化方案:

  中序遍历二叉搜索树

  转化当前节点的左节点converTree(pTree->left, prev);  

  找到当前节点pTree,pTree->left = prev

  如果prev不为空,则prev->next = pTree

  prev = prev->next往后移动

  转化当前节点的右节点

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void converTree(TreeNode * pTree, TreeNode *&prev) //二级指针 = 指针引用 (降级,可以直接用pre操作,否则要*pre)
{
if(pTree == nullptr)
{
return ;
}
converTree(pTree->left, prev); pTree->left = prev;
if(prev != nullptr)
{
prev->right = pTree;
}
prev = pTree; converTree(pTree->right, prev);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr)
{
return nullptr;
}
TreeNode *pTree = nullptr;
//转化
converTree(pRootOfTree,pTree);
//输出头节点
TreeNode *ret = pRootOfTree;
while(ret->left != nullptr)
{
ret = ret->left;
}
return ret;
}
};

  

最新文章

  1. POJ 1850 Code
  2. Middleware In ASP.NET Core
  3. Eclispe 安装PropertiesEditor插件
  4. linux设备驱动层次
  5. TGL 月光精品教程整理
  6. HTML+CSS学习笔记 (10) - CSS格式化排版
  7. ExtJS4.2学习(二)Ext统一组件模型——Panel
  8. bzoj1030
  9. Hibernate解决高并发问题之:悲观锁 VS 乐观锁
  10. oracle使用还原段的目的和还原数据的管理方法及还原段的类型
  11. 一个基于MINA框架应用的最简单例子
  12. 简单RPC实现之Netty实现
  13. Android 打造编译时注解解析框架 这只是一个开始
  14. Python爬虫入门教程 4-100 美空网未登录图片爬取
  15. 1.Git起步-Git的三种状态以及三种工作区域、CVCS与DVCS的区别、Git基本工作流程
  16. Java并发编程-再谈 AbstractQueuedSynchronizer 1 :独占模式
  17. redis出现错误:NOAUTH Authentication required.
  18. 51nod1236 序列求和 V3 【数学】
  19. JS定时器时间日期钟表
  20. mysql学习(4)python操作数据库

热门文章

  1. [Untiy]贪吃蛇大作战(四)——游戏主界面
  2. Golang如何实现节假日不打扰用户?
  3. Ubuntu 22.04 BigSur 美化
  4. 学习ASP.NET Core Blazor编程系列二十二——登录(1)
  5. 请务必注意精度不一样,就不相等(float 与double)
  6. 前端必备基础知识之--------原生JS发送Ajax请求
  7. 方法的调用-JDK的JShell简单使用
  8. Containerd NRI 插件
  9. (一)Abp入门
  10. Redis 异步客户端选型及落地实践