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

来源:互联网 发布:随机出题软件破解 编辑:程序博客网 时间:2024/05/22 06:16

题目来源:http://bbs.csdn.net/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 *&current, 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;}