【剑指Offer】【树】【双向链表】二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节点
双向链表中每个节点都有一个prev指针指向前驱节点,一个next指针指向后继节点
在二叉搜索树中,左节点小于父节点,右节点大于父节点;
在排序双向链表中,前驱节点小于当前节点,后继节点大于当前节点
得到以下转化方案:
中序遍历二叉搜索树
转化当前节点的左节点converTree(pTree->left, prev);
找到当前节点pTree,pTree->left = prev
如果prev不为空,则prev->next = pTree
prev = prev->next往后移动
转化当前节点的右节点
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void converTree(TreeNode * pTree, TreeNode *&prev) //二级指针 = 指针引用 (降级,可以直接用pre操作,否则要*pre) { if(pTree == nullptr) { return ; } converTree(pTree->left, prev); pTree->left = prev; if(prev != nullptr) { prev->right = pTree; } prev = pTree; converTree(pTree->right, prev); } TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == nullptr) { return nullptr; } TreeNode *pTree = nullptr; //转化 converTree(pRootOfTree,pTree); //输出头节点 TreeNode *ret = pRootOfTree; while(ret->left != nullptr) { ret = ret->left; } return ret; } };