算法题22 把二元查找树转变成排序的双向链表(中序遍历)

题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    
  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); }

    原文作者:排序算法
    原文地址: https://blog.csdn.net/wcyoot/article/details/6428297
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞