【面试题】二叉搜索树转换双向链表

题目描述

输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。

二叉搜索树,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。

解题思路

如果用中序遍历二叉搜索树,遍历结点的顺序就是从小到大。所以这题的基本思路就是:用中序遍历一下二叉树,同时保留当前链表的最后一个指针pLast,以及当前指针pCurrent,每访问一个节点更新一下两者的值。

代码实现stdlibtime.h>using namespace std;typedef struct TreeNode{int data;TreeNode *Leftchild;TreeNode *Rightchild;}TreeNode, *PtreeNode;PtreeNode InsertSortTree(PtreeNode Tree, int data){if(Tree == NULL){Tree = new TreeNode;Tree;Tree->Leftchild = NULL;Tree->Rightchild = NULL;})Tree->Leftchild = InsertSortTree(Tree->Leftchild, data);)Tree->Rightchild = InsertSortTree(Tree->Rightchild, data);return Tree;}PtreeNode CreatSortTree(PtreeNode Tree){srand(time(NULL));cout endl;for(int i ; i ++){int ;cout ;Tree = InsertSortTree(Tree, data);}cout << endl;return Tree;}void PreOrderTraverse(PtreeNode Tree){if(Tree == NULL)return;PreOrderTraverse(Tree->Leftchild);cout ;PreOrderTraverse(Tree->Rightchild);}void CoverToList(PtreeNode Tree, PtreeNode *lastNode){if(Tree == NULL)return;PtreeNode pCurrent = Tree;if(pCurrent->Leftchild != NULL)CoverToList(pCurrent->Leftchild, lastNode);pCurrent->Leftchild = *lastNode;if((*lastNode) != NULL)(*lastNode)->Rightchild = pCurrent;*lastNode = pCurrent;if(pCurrent->Rightchild != NULL)CoverToList(pCurrent->Rightchild, lastNode);}PtreeNode Cover(PtreeNode Tree){PtreeNode lastNode = NULL;CoverToList(Tree, &lastNode);PtreeNode pHeadList = lastNode;pHeadList->Leftchild != NULL)pHeadList = pHeadList->Leftchild;return pHeadList;}void Print_Tree(PtreeNode Tree){cout endl;PreOrderTraverse(Tree);}void Print_List(PtreeNode List){cout endl;){cout ;Rightchild;}cout << endl;}int main(int argc, char const *argv[]){PtreeNode Tree = NULL;Tree = CreatSortTree(Tree);Print_Tree(Tree);Tree = Cover(Tree);Print_List(Tree);return 0;}

,我们可以冷静理智的给这些刺一一贴上标签:骄傲,自负,脆弱的自尊心,

【面试题】二叉搜索树转换双向链表

相关文章:

你感兴趣的文章:

标签云: