将一颗搜索树转换成一个排序的双向链表。要求不能创建任何新的节点

来源:互联网 发布:北京医疗软件开发商 编辑:程序博客网 时间:2024/06/07 00:36

思路:
在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链表,只是因为两个指针的指向不同而已,通过改变其指针的指向来实现是完全可能的。

为了减少指针的变换次数,并让操作更加简单,在转换成排序双向链表时,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向下一个结点的指针。由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。同时中序遍历过程正好是转换成链表的过程,可采用递归方法处理。

完整代码及测试

typedef struct BinartTree{    int _value;    BinartTree* _left;    BinartTree* _right;}Node;//构建二叉树Node* CreateBinaryTree(int value){    Node* root = new Node();    root->_value = value;    root->_left = NULL;    root->_right = NULL;    return root;}//构建树的左右节点void ConnectTreeNode(Node* parent, Node* pleft, Node* pright){    if (parent != NULL)    {        parent->_left = pleft;        parent->_right = pright;    }}//中序遍历树节点void InOrder(Node* root){    if (root == NULL)        cout<<"this is empty Node";    if (root->_left)    {        InOrder(root->_left);    }    cout << root->_value<<" ";    if (root->_right)    {        InOrder(root->_right);    }}//转换搜索二叉树为双向链表void BinaryTreeToList(Node* root, Node** listNode){    if (root == NULL)        return;    Node* pcur = root;    if (root->_left)    {        BinaryTreeToList(root->_left,listNode);    }    pcur->_left = *listNode;    if (*listNode)    {        (*listNode)->_right = pcur;    }    *listNode = pcur;    if (root->_right)    {        BinaryTreeToList(root->_right, listNode);    }}//获取双向链表的头Node* ListHead(Node* proot){    Node* listNode = NULL;    BinaryTreeToList(proot, &listNode);    Node* pHead = listNode;    while (pHead && pHead->_left)    {        pHead = pHead->_left;    }    return pHead;}//打印双向链表void Print(Node* pHead){    Node* cur = pHead;    while (cur)    {        cout << cur->_value << " ";        cur = cur->_right;    }    cout << endl;}void test(){    Node* n10 = CreateBinaryTree(10);    Node* n6 = CreateBinaryTree(6);    Node* n14 = CreateBinaryTree(14);    Node* n4 = CreateBinaryTree(4);    Node* n8 = CreateBinaryTree(8);    Node* n12 = CreateBinaryTree(12);    Node* n16 = CreateBinaryTree(16);    ConnectTreeNode(n10, n6, n14);    ConnectTreeNode(n6, n4, n8);    ConnectTreeNode(n14, n12, n16);    InOrder(n10);    cout << endl;    Node* pHead = ListHead(n10);    Print(pHead);}
阅读全文
0 0