第一题(二元查找树转变成排序的双向链表)

来源:互联网 发布:如何登录淘宝店铺 编辑:程序博客网 时间:2024/06/02 13:34

1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:

struct BSTreeNode{<span style="white-space:pre"></span>int m_nValue; // value of node<span style="white-space:pre"></span>BSTreeNode *m_pLeft; // left child of node<span style="white-space:pre"></span>BSTreeNode *m_pRight; // right child of node};
方法一:
根据二叉查找树的性质,采用中序遍历二叉查找树的方式遍历到的节点元素有序,程序采用递归实现,我们可以使用变量current和lastNode记录当前节点和上一个遍历到的节点,通过引用传参的方式将当前节点赋给调用遍历下一个节点函数的形参lastNode,在函数内部将current连接到lastNode的后面形成双向链表。

C++代码:

namespace MS100P_1{struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNode *m_pRight; // right child of node};void convert(BSTreeNode* root, BSTreeNode* &lastNode){if (root == NULL)return;BSTreeNode* current = root;if (root->m_pLeft != NULL)convert(root->m_pLeft, lastNode);if (lastNode != NULL)lastNode->m_pRight = current;current->m_pLeft = lastNode;lastNode = current;if (root->m_pRight != NULL)convert(root->m_pRight, current);}BSTreeNode *Solution(BSTreeNode *head){BSTreeNode *lastNode = NULL;convert(head, lastNode);BSTreeNode *listHead = lastNode;while (listHead != NULL&&listHead->m_pLeft != NULL)listHead = listHead->m_pLeft;return listHead;}}





0 0
原创粉丝点击