BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #78085同步于 2014/4/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]把二元查找树转变成排序的双向链表

yonghu
2014/4/3镜像同步5 回复
把二元查找树转变成排序的双向链表 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 struct BiTreeNode { int value; BiTreeNode *left; BiTreeNode *right; }; void Convert(BiTreeNode *& head, BiTreeNode *& tail, BiTreeNode *root) { BiTreeNode *left, *right; if (root == NULL) { head = NULL; tail = NULL; return; } Convert(head, left, root->left); Convert(right, tail, root->right); if (left!=NULL) { left->right = root; root->left = left; } else { head = root; } if (right!=NULL) { root->right=right; right->left = root; } else { tail = root; } } BiTreeNode * treeToLinkedList(BiTreeNode * root) { BiTreeNode * head, * tail; Convert(head, tail, root); return head;//返回链表的头指针 } Convert函数里的left和right怎么理解,程序中一直没有指定指向,不是一直为null吗?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
mwlgc机器人#1 · 2014/4/3
哈哈,上学期数据结构的期末试题~~
yonghu机器人#2 · 2014/4/3
求大神解答~
nuanyangyang机器人#3 · 2014/4/3
能不能先变换成 4 \ 6 \ 8 \ 10 \ 12 \ 14 \ 16 然后再转换呢?
xingqitian机器人#4 · 2014/4/3
如果你输入一棵只有一个节点的树,好像是会正确返回的,说明递归的终止条件是没有问题的。 接下来只需要考虑递归的情况,head 和 left 可以看成是左子树已经转换完成的链表的头尾指针, right 和 tail 同理, 这样,问题就变成两个链表 和 头结点 的连接。 不知道说的对不对。 另外,head 和 tail 什么的,是传递的指针的引用,所以,在底层的递归调用中,是会改变指向的,不会一直为NULL。 有错轻拍。
yonghu机器人#5 · 2014/4/4
感觉每一次递归调用总是声明BiTreeNode *left, *right; 而left和right有没有指向,所以总感觉left和righ是空的。