题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
此题实质就是考察递归的使用以及树的遍历。中序遍历二元查找数的结果就是有序的目标节点顺序。
只需按中序遍历的顺序把节点链接到链表尾端即可。
代码:
- template<typename T>
- struct TreeNode
- {
- T data;
- TreeNode* pLChild;
- TreeNode* pRChild;
- };
- // 要求两个输出参数要初始化为NULL
- template<typename T>
- void ConvertBSTree2List(TreeNode<T>* pTreeRoot/*树的根节点*/, TreeNode<T>*& pListHead/*双向链表的头指针*/, TreeNode<T>*& pListLast/*双向链表的尾指针*/)
- {
- if(pTreeRoot == NULL)
- {
- return;
- }
- // 中序遍历左子树
- ConvertBSTree2List(pTreeRoot->pLChild, pListHead, pListLast);
- // 处理当前节点,把节点链到双向链表尾部
- // 修改当前节点左指针,指向双向链表尾部
- pTreeRoot->pLChild = pListLast;
- if(pListLast) // 非第一个节点
- {
- pListLast->pRChild = pTreeRoot;
- }
- else // 第一个节点
- {
- pListHead = pTreeRoot;
- }
- pListLast = pTreeRoot;
- // 中序遍历右子树
- ConvertBSTree2List(pTreeRoot->pRChild, pListHead, pListLast);
- }