/*************************************************************************
> 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 二叉搜索树转换为排序双向链表的更多相关文章

  1. 剑指offer 二叉搜索树与双向链表

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  2. 剑指offer 二叉搜索树和双向链表

    剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...

  3. 剑指Offer——二叉搜索树与双向链表

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...

  4. 剑指Offer-26.二叉搜索树与双向链表(C++/Java)

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...

  5. 用js刷剑指offer(二叉搜索树与双向链表)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...

  6. 剑指Offer 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   思路: 后续遍历数组的尾部为根节点,前面的部分 ...

  7. 剑指Offer——二叉搜索树的第k个结点

    题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...

  8. 剑指Offer——二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...

  9. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

随机推荐

  1. js判断滚动方向

     //页面滚动监听事件     window.onscroll = function (e) {                scrollFunc();         $("#t&quo ...

  2. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  3. installshield basic msi 更新时覆盖不了上一个版本文件解决方案1

    1.增加dll exe程序集的版本号 2.设置IS里文件的Set key file

  4. 固定分隔符字符串与数组互转及ArrayList与数组(Array)互转

    1.字符串转数组 这个相信多数人都会常用,string.split方法,分隔符可以为多个.详细信息参见MSDN string[] actionCfgs = _para.Split(new char[] ...

  5. PHP高级应用视频教程大全学习

    php 是一种服务器端的,嵌入html的脚本语言.php区别其他像客户端java的地方是它的代码在服务器端执行.php能做什么?最低水平,php可以做任何其他cgi程序所能做的事,例如收集表格数据,生 ...

  6. jQuery each,避免使用js for循环

    What is the difference between $.each(selector) and $(selector).each(): http://stackoverflow.com/que ...

  7. HTML中诡异的空文本

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-03-27) 今天在写代码的时候发现了一个诡异的问题,我的HTML页面代码当中明明没有多余的行,标签书写规范,没有加任何样式( ...

  8. cocos2d制作动态光晕效果基础——blendFunc

    转自:http://www.2cto.com/kf/201207/144191.html 最近的项目要求动态光晕的效果. 何谓动态光晕?之前不知道别人怎么称呼这个效果, 不过在我看来,“动态光晕”这个 ...

  9. Qtwebkit flashplayer插件问题

      复制npswf32.dll 到 C:\WINDOWS\system32\Macromed\Flash\ 代码加入: //! [1] QNetworkProxyFactory::setUseSyst ...

  10. Visual Studio 2012 使用SvcUtil在MVC4客户端引用WCF服务

    已创建服务. 若要测试此服务,需要创建一个客户端,并将其用于调用该服务.可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作: svcutil.exe http://localh ...