剑指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.二叉搜索树的后序遍历序列
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...
随机推荐
- sqlserver锁表、解锁、查看锁表
sqlserver锁表.解锁.查看锁表 http://www.cnblogs.com/zfanlong1314/p/3698566.html http://www.cnblogs.com/chjf20 ...
- JavaBean技术
引言: JavaBeans与一般Java类的编写类似. 在JSP页面中要使用JavaBeans,只要在JSP页面中使用JavaBeans的操作标记就可以了. JavaBeans的编写和使用非常简单,下 ...
- Android - Facebook KeyHash 設定
转自:http://www.dotblogs.com.tw/newmonkey48/archive/2014/04/17/144779.aspx App要使用Facebook 分享時,設要在Faceb ...
- Javascript如何访问和处理系统文件
一.功能实现核心:FileSystemObject 对象 要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象. 二.FileSystemObject编程 使用 ...
- ntoskrnl.exe损坏或丢失的解决方式
同事的电脑启动时出现下面提示:"因下面文件损坏或丢失Windows无法启动 %systemroot%\system32\ntoskrnl.exe,请又一次安装以上文件的拷贝"(Wi ...
- 王立平--EditPlus激活码
注冊名:Free User 注冊码:6AC8D-784D8-DDZ95-B8W3A-45TFA
- getFields()和getDeclaredFields()
getFields()获得某个类的所有的公共(public)的字段,包括父类. getDeclaredFields()获得某个类的所有申明的字段,即包括public.private和proteced, ...
- EntityFrameWork关系映射
转:http://kb.cnblogs.com/page/108643/ Entity Framework 实体关系总结 作者: dudu 来源: 博客园 发布时间: 2011-10-28 20: ...
- navigationController pushViewController 多次跳转后怎么返回
使用NavigationViewController进行页面跳转时,应该使用pushViewController方法来跳转至下一页面,这样的话,下一页面同样在NavigationViewControl ...
- 基于HTML5实现五彩连珠小游戏
今天给大家分享一款基于HTML5实现五彩连珠小游戏.这款游戏的规则:点击彩球移动到期望的位置,每移动一次,画面将随机出现3个新的彩球:当同一颜色的彩球连成5个一行或一列或一斜线时,这5个彩球同时消失, ...