题目来源:http://bbs.youkuaiyun.com/topics/350118968
1.把二元查找树转变成排序的双向链表
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:首先构建一个二叉排序树,中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct TreeNode
{
int nValue;
TreeNode *left;
TreeNode *right;
};
typedef TreeNode DoubleList;
DoubleList * pHead = NULL;
DoubleList * pListIndex = NULL;
//建立二叉排序树
void addTreeNode(TreeNode *¤t, int value)
{
if(current == NULL)
{
TreeNode *tree = new TreeNode();
tree->left = NULL;
tree->right = NULL;
tree->nValue = value;
current = tree;
}
else
{
if((current->nValue) > value)
addTreeNode(current->left, value);
else if((current->nValue) < value)
addTreeNode(current->right, value);
else
cout << "重复节点" << endl;
}
}
//修改二叉树的指针指向
void changeList(TreeNode *current)
{
current->left = pListIndex;
if(NULL != pListIndex)
pListIndex->right = current;
else
pHead = current;
pListIndex = current;
cout << current->nValue << endl;
}
//中序遍历
void travel(TreeNode *head)
{
if(head == NULL)
return;
if(head->left != NULL)
travel(head->left);
changeList(head);
if(head->right != NULL)
travel(head->right);
}
int main()
{
TreeNode *Root = NULL;
int t;
addTreeNode(Root, 10);
addTreeNode(Root, 4);
addTreeNode(Root, 6);
addTreeNode(Root, 8);
addTreeNode(Root, 12);
addTreeNode(Root, 14);
addTreeNode(Root, 15);
addTreeNode(Root, 16);
travel(Root);
return 0;
}