版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
牛客网链接:二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
先简单说一说二叉搜索树,二叉搜索树有一个特点:根大于左子树,小于右子树。二叉搜索树的中序遍历是有序的序列。
如下的一棵搜索二叉树:
转换成有序双向链表就要对搜索二叉树进行中序遍历
双向链表结点的prev可以理解成二叉树的left,next理解成right。
中序遍历的时候需要prev对上一个结点记录
void _Convert(TreeNode* root, TreeNode* &prev) {
if (root == NULL)
return;
_Convert(root->left, prev);
root->left = prev;
if (prev)
prev->right = root;
prev = root;
_Convert(root->right, prev);
}
TreeNode* Convert(TreeNode* pRootOfTree) {
if (pRootOfTree == NULL)
return NULL;
TreeNode* prev = NULL;
_Convert(pRootOfTree, prev);
//寻找双向链表的头结点
TreeNode* head = pRootOfTree;
while (head && head->left) {
head = head->left;
}
return head;
}