一:首先介绍二叉搜索树;
概念:二叉搜索树是指在一颗二叉树上,这颗二叉树上的每个节点都有:所有左节点 < 该节点 < 所有右节点; 例如下树
二:根据搜索二叉树特性分析
因为二叉树的实现也是靠指针实现的,所以其数据结构和双向链表的结构是相同的;若把箭头话上,就变成了这样子。
注:红色代表指向空
所以根据特性,我们只需要将每个节点左边的节点均放在其左边;把每个节点右边的节点均放在其右边,这样就可以拍好序了。
三:图解
首先我们需要设置一个索引,防止丢失;我们在这里设置一个索引位prev = NULL;
第一步:用root拿到最左边的数(即最小的数),用root指向prev
第二步:访问其右子树位空,让prev = root 并将root返回到12
第三步:让prev->left 指向让root->right->prev,
如此递归下去,就可以完成了;
四:代码
class Solution {
public:
void _Convrt(TreeNode *root, TreeNode **prev)
{
if(root == NULL)
{
return;
}
_Convrt(root->left,prev);
root->left = *prev;
if(*prev)
{
(*prev)->right = root;
}
*prev = root;
_Convrt(root->right,prev);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
{
return NULL;
}
TreeNode *prev = NULL;
_Convrt(pRootOfTree, &prev);
TreeNode *head = pRootOfTree;
while(head && head->left)
{
head = head->left;
}
return head;
}
};