剑指Offer25 二叉搜索树转换为排序双向链表
/*************************************************************************
> File Name: 25_BSTConvert.cpp
> Author: Juntaran
> Mail: JuntaranMail@gmail.com
> Created Time: 2016年08月31日 星期三 15时06分28秒
************************************************************************/ #include <stdio.h>
#include <malloc.h> // 二叉树结构体
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
}; // 构造二叉搜索树
TreeNode* InsertNode(TreeNode* tree, int val)
{
if (tree == NULL)
{
tree = new TreeNode();
tree->left = NULL;
tree->right = NULL;
tree->val = val;
}
else if (tree->val > val)
tree->left = InsertNode(tree->left, val);
else if (tree->val < val)
tree->right = InsertNode(tree->right, val);
return tree;
} void PrintTree(TreeNode* tree)
{
if (tree == NULL)
return;
PrintTree(tree->left);
printf("%d ", tree->val);
PrintTree(tree->right);
} void PrintList(TreeNode* list)
{
printf("\n");
if (list == NULL)
return;
TreeNode* node = list;
while (node)
{
printf("%d ", node->val);
node = node->right;
}
printf("\n");
} /************************************************************************/
// 剑指Offer写法
void ConvertNode(TreeNode* node, TreeNode** last)
{
if (node == NULL)
return; TreeNode* current = node; // 对tree的左子树进行转换,last是转换后链表最后一个结点的指针
if (current->left != NULL)
ConvertNode(current->left, last);
// 调整tree的left指针,指向上一个结点
current->left = *last;
// 调整指向最后一个结点,right指向下一个结点
if (*last != NULL)
(*last)->right = current; // 调整指向最后链表一个结点的指针
*last = current; // 对tree的右子树进行转换,last是转换后链表最后一个结点的指针
if (current->right != NULL)
ConvertNode(current->right, last);
} // 二叉搜索树转换为排序双向链表
TreeNode* Convert(TreeNode* root)
{
if (root == NULL)
return NULL; TreeNode* last = NULL;
ConvertNode(root, &last); TreeNode* head = root;
// 找到最左边的结点,即转换后链表的头结点
while (head && head->left)
head = head->left;
return head;
}
/************************************************************************/ /************************************************************************/
// 一个递归写法 TreeNode* leftLast = NULL;
TreeNode* Convert2(TreeNode* root)
{
if (root == NULL)
return root;
if (root->left==NULL && root->right==NULL)
{
leftLast = root;
return root;
} // 左子树改造为双链表
TreeNode* left = Convert2(root->left);
// 左子树链表不为空,root追加到左子树链表
if (left != NULL)
{
leftLast->right = root;
root->left = leftLast; // 构造双向链表
}
leftLast = root;
// 右子树改造为双链表
TreeNode* right = Convert2(root->right);
// 右子树链表不为空,链表追加到root后
if (right != NULL)
{
right->left = root;
root->right = right;
}
return left != NULL ? left : root;
}
/************************************************************************/ int main()
{
TreeNode* tree = NULL;
for (int i = ; i > ; --i)
{
tree = InsertNode(tree, i);
}
for (int i = ; i <= ; ++i)
{
tree = InsertNode(tree, i);
}
PrintTree(tree);
// tree = Convert(tree);
tree = Convert2(tree);
PrintList(tree); return ;
}
剑指Offer25 二叉搜索树转换为排序双向链表的更多相关文章
- 剑指offer 二叉搜索树与双向链表
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 剑指offer 二叉搜索树和双向链表
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...
- 剑指Offer——二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...
- 剑指Offer-26.二叉搜索树与双向链表(C++/Java)
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...
- 用js刷剑指offer(二叉搜索树与双向链表)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...
- 剑指Offer 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 后续遍历数组的尾部为根节点,前面的部分 ...
- 剑指Offer——二叉搜索树的第k个结点
题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...
- 剑指Offer——二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...
- 剑指offer--30.二叉搜索树的后序遍历序列
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...
随机推荐
- STL容器set()--->自定义数据类型
set容器中不能插入重复的元素,需要其插入的元素有比较大小(<).相等(==) 的逻辑判断,这是因为set中的元素是有序排列, 默认从小到大排列 std::set<type,std::le ...
- 关于div的居中的问题
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-01-11) div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性, ...
- cocos2dx中加入unzip
作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037323.html cocos2dx中没有直接解压文件的,自己网上找了个,记录一下. ...
- Eclipse设置选中高亮显示(包含debug)
如果不高亮显示了:工具栏里有个黄色小笔的图标,点一下就可以了,或者alt+shift+O 设置高亮显示:
- IAR Build from the command line 环境变量设置
http://supp.iar.com/Support/?Note=47884 Technical Note 47884 Build from the command line The alterna ...
- Ajax的常用框架有哪些?
AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML),是创建交互式Web应用的主要开发技术.互联网中也有大量的关于AJAX的框架,本文汇总了最常 ...
- SharePoint 2013 中使用 JavaScript Like 和Unlike list item/page/document
SharePoint 2013中新增了很多社交功能,比如用户可以like/unlike 任何一个 list item/page/document,这是一个非常不错的功能. 但有时觉得like/unli ...
- 一份Java学习路线图
Java学习路线图 本文会持续更新,敬请关注.下划线的文字会在这个博客继续更新. 回顾自己的Java学习经历,从学校的课堂到现在每天的项目开发,一份路线路线图浮出来. 其中有未做好的地方,也有自我感觉 ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- iOS开发——数据持久化Swift篇&(一)NSUserDefault
NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...