输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:中序遍历二叉搜索树递归与非递归方式
TreeNode* Convert(TreeNode* pRootOfTree)
{
//中序遍历
//left指向前一个节点,right指向后一个节点
//非递归
if(pRootOfTree==NULL) return pRootOfTree;
TreeNode*p,*pre,*proot;
stack<TreeNode*>st;
bool flag=false;
p=pRootOfTree;
do{
while(p!=NULL)
{
st.push(p);
p=p->left;
}
if(!st.empty())
{
p=st.top();
if(pre!=NULL)
{
p->left=pre;
pre->right=p;
}
pre=p;
if(!flag)
{
proot=p;
flag=true;
}
st.pop();
//if(p->right!=NULL)
p=p->right;
}
}while(p!=NULL||!st.empty());
return proot;
}
//递归
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)return NULL;
TreeNode*pre=NULL,*p=pRootOfTree;
ConvertHelper(pRootOfTree,pre);
while(p->left!=NULL)
{
p=p->left;
}
return p;
}
void ConvertHelper(TreeNode* root,TreeNode*&pre)
{
if(root==NULL)return;
ConvertHelper(root->left,pre);
root->left=pre;
if(pre)pre->right=root;
pre=root;
ConvertHelper(root->right,pre);
}