您的位置:首页 > 理论基础 > 数据结构算法

把二元查找树转变成排序的双向链表

2017-07-06 15:46 330 查看
题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ \

6 14

/ \ / \

4 8 12 16

转换成双向链表

4=6=8=10=12=14=16

16=14=12=10=8=6=4

#include <iostream>
using namespace std;

/*二叉树结点类*/
class Binary_Search_Tree_Node
{
public:
Binary_Search_Tree_Node() :data(0), left_subtree_address(NULL), right_subtree_address(NULL)
{
}
int data;
Binary_Search_Tree_Node* left_subtree_address;
Binary_Search_Tree_Node* right_subtree_address;
};

typedef Binary_Search_Tree_Node* Tree_Node_address;

Tree_Node_address LDR_first_node_address = NULL;/*保存循环链表第一个结点*/
Tree_Node_address tmp_operate = NULL;/*转换操作介参*/

/* 建立二叉排序树 */
void Add_Tree_Node(Tree_Node_address& current_node_address, int value)
{
if (!current_node_address){
Tree_Node_address node_address = new Binary_Search_Tree_Node;
if(!node_address)
cout << "分配内存失败" << endl;
node_address->data = value;
node_address->left_subtree_address = NULL;
node_address->right_subtree_address = NULL;
current_node_address = node_address;
}
else if (current_node_address->data < value) /*大的放右边*/
Add_Tree_Node(current_node_address->right_subtree_address, value);
else if (current_node_address->data > value) /*小的放左边*/
Add_Tree_Node(current_node_address->left_subtree_address, value);
else
cout << "node repeated" << endl;

}

/* 打印双向链表链表 */
void Print_List(Tree_Node_address first_node_address)
{
if (!first_node_address)
return;
while (first_node_address->right_subtree_address)
{
cout << first_node_address->data << " ";
first_node_address = first_node_address->right_subtree_address;
}

cout << first_node_address->data << endl;
while (first_node_address)
{
cout << first_node_address->data << " ";
first_node_address = first_node_address->left_subtree_address;
}

}

/* 调整结点保存的右子树指针成 -> 双向链表 */
void Tree_To_List(Tree_Node_address current_node_address)
{

current_node_address->left_subtree_address = tmp_operate;

if (NULL == tmp_operate)
LDR_first_node_address = current_node_address;/*定头结点*/
else
tmp_operate->right_subtree_address = current_node_address;/*换指向*/

tmp_operate = current_node_address;

}

/* 中序遍历二叉树(递归) */
void Inorder_Traversal_Tree(Tree_Node_address current_node_address)
{

if (NULL == current_node_address)
return;

if (current_node_address->left_subtree_address)
Inorder_Traversal_Tree(current_node_address->left_subtree_address);

Tree_To_List(current_node_address);/* 调整结点指针 */

if (current_node_address->right_subtree_address)
Inorder_Traversal_Tree(current_node_address->right_subtree_address);

}

/* 测试函数 */
int main()
{
Tree_Node_address first_node_address = NULL;

Add_Tree_Node(first_node_address, 10);

Add_Tree_Node(first_node_address, 6);

Add_Tree_Node(first_node_address, 14);

Add_Tree_Node(first_node_address, 4);

Add_Tree_Node(first_node_address, 8);

Add_Tree_Node(first_node_address, 12);

Add_Tree_Node(first_node_address, 16);

Inorder_Traversal_Tree(first_node_address);

Print_List(LDR_first_node_address);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息