#include <cstdio> #include <cstdlib> using namespace std; struct treeNode { int id; struct treeNode *lchild; struct treeNode *rchild; }; void insert(struct treeNode*& node, int x) { if (node == NULL) { node = (struct treeNode*)malloc(sizeof(struct treeNode)); node->id = x; node->lchild = NULL; node->rchild = NULL; return; } else if (x < node->id) insert(node->lchild, x); else if (x > node->id) insert(node->rchild, x); else return; } void visit(struct treeNode* node, struct treeNode*& prev) { if (node == NULL) return; if (node->lchild != NULL) visit(node->lchild, prev); if (prev == NULL) node->lchild = prev; else { node->lchild = prev; prev->rchild = node; } prev = node; if (node->rchild != NULL) visit(node->rchild, prev); } struct treeNode* changeToList(struct treeNode* node) { struct treeNode* prev = NULL; struct treeNode* head = node; visit(node, prev); while (head != NULL && head->lchild != NULL) head = head->lchild; return head; } int main() { struct treeNode *root = (struct treeNode*)malloc(sizeof(struct treeNode)); root->id = 10; root->lchild = root->rchild = NULL; insert(root, 6); insert(root, 14); insert(root, 4); insert(root, 8); insert(root, 12); insert(root, 16); struct treeNode *head = changeToList(root); return 0; } 采用的是中序遍历的方法,因为中序遍历二叉排序树是有序的,所以每访问一个节点,就把该节点置为prev,之后每访问一个节点,就和prev(也就是链表的尾节点)相连接。