问题描述:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。

10
   /   \
  6      14
/  \    /   \
4   8 12    16

转换成双向链表
4=6=8=10=12=14=16。

首先我们定义的二元查找树 节点的数据结构如下:

struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *left; // left child of node
BSTreeNode *right; // right child of node
};

代码实现:

 // 1.cc
// 题目:
// 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
// 要求不能创建任何新的结点,只调整指针的指向。 // 10
// / /
// 6 14
// / / / /
// 4 8 12 16 // 转换成双向链表
// 4=6=8=10=12=14=16 #include <iostream>
using namespace std; typedef struct BSTreeNode {
int value;
BSTreeNode *left;
BSTreeNode *right;
} tree_node; // 创建二元查找树
void add_BSTree_node(tree_node* &p_current, int value) {
if (NULL == p_current) {
tree_node *node = new tree_node();
node->left = NULL;
node->right = NULL;
node->value = value;
p_current = node;
} else {
if (p_current->value > value)
add_BSTree_node(p_current->left, value);
else if (p_current->value < value)
add_BSTree_node(p_current->right, value);
else
cout << "The value has already in the tree.";
} }
// 二叉树转双向链表
void tree_to_list(tree_node* root, tree_node* &head, tree_node* &last)
{
//为空,返回
if (!root)
return;
//中续遍历子树,针对于每个节点设置节点的left和last->right,同时保存为last
tree_to_list(root->left, head, last);
root->left = last;
if (last)
last->right = root;
else
head = root;
last = root;
tree_to_list(root->right, head, last);
} // 打印双向链表
void print_list(tree_node* head) {
tree_node* p = head;
while (p) {
cout << p->value << " ";
p = p->right;
}
cout << endl;
} int main() {
tree_node *root = NULL; add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, ); tree_node* head = NULL;
tree_node* last = NULL;
tree_to_list(root, head, last);
print_list(head);
}

转载自源代码

本文链接地址: http://w.worthsee.com/index.php/1-%e6%8a%8a%e4%ba%8c%e5%85%83%e6%9f%a5%e6%89%be%e6%a0%91%e8%bd%ac%e5%8f%98%

IT公司100题-1-二叉树转换为双链表的更多相关文章

  1. IT公司100题-11-求二叉树中节点的最大距离

    问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根 ...

  2. IT公司100题-7-判断两个链表是否相交

    问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需 ...

  3. IT公司100题-15-求二元查找树的镜像

    问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树.   例如输入:   6/    \4     12/ \   /   \2  5 8   16 输出:   6/ ...

  4. IT公司100题-16-层遍历二元树

    问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeN ...

  5. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  6. IT公司100题-32-交换元素,使数组差最小

    问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...

  7. IT公司100题-28-整数的二进制表示中1的个数

    问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1.     分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进 ...

  8. IT公司100题-27-跳台阶问题

    问题描述: 一个台阶总共有n阶,一次可以跳1级或者2级.求总共有多少种跳法.   分析: 用f(n)表示n阶台阶总共有多少种跳法.n阶台阶,第一可以选择跳1阶或者2阶,则f(n) = f(n-1) + ...

  9. IT公司100题-tencent-打印所有高度为2的路径

    问题描述: 打印所有到叶子节点长度为2的路径  10  /  \ 6   16 / \   / \ 4 8  14 18   / \    / \    \ 2  5  12 15 20 / 11   ...

随机推荐

  1. JavaSE复习_3 继承

    △先默认初始化,在显示初始化,在构造函数初始化 △继承的弊端:代码的耦合性增加了. △子类不能继承父类的构造方法. △子类会拥有父类的私有成员变量,但是必须通过get,set方法访问. △super不 ...

  2. Android ViewPager更新数据

    ViewPager也是一个常用的组件 与ListView类似 当绑定数据后 想刷新数据 需要在适配器中添加如下方法 protected PagerAdapter galleryAdapter = ne ...

  3. golang csv,xls,xlsx

    要用到的包: "golang.org/x/text/encoding/simplifiedchinese"    "golang.org/x/text/transform ...

  4. VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)

    http://www.askmaclean.com/archives/vbox-virtualbox-64-bit.html ************************************* ...

  5. OpenGL的gluLookAt和glOrtho的关系

    OpenGL的gluLookAt和glOrtho的关系 一直不明白gluLookAt()和glOrtho()两者之间的关系:gluLookAt()是观察变换,glOrtho()是正交投影.glLook ...

  6. Hbase之遍历超时处理

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...

  7. SCCM 部署操作系统 ,提示权限问题,报错:0xc00000098

    SCCM 部署操作系统 ,提示权限问题,报错:0xc00000098 这个问题通过查看日志,论坛搜索,博客等.下面是最终的解决方法: 1.检查所有组件是否已安装.(IIS组件等).(分发站点证书是否正 ...

  8. View绑定式监听器实现原理

    在我们开发android的时候,会经常重写自定义的View去满足一些需求 然后有时候view会提供一些回调,比如view某个部分被点击了,我们需要通知使用者然后再通过接口传一些参数过去. 对于我之前的 ...

  9. jqury.jqzoom插件--放大镜

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. Android 使用dagger2进行依赖注入(基础篇)

    0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...