题目:
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6将二叉树转换为链表,注意到输出的顺序跟前序完全一样,所以自然想到在前序遍历的基础上稍作修改。
void flatten(TreeNode *root)
{
if(root==NULL) return ;
TreeNode *x=NULL;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty())
{
x=stk.top();
stk.pop();
if(x->right !=NULL) stk.push(x->right);
if(x->left !=NULL) stk.push(x->left);
x->left=NULL; //增加的地方;
if(!stk.empty()) x->right=stk.top();
else x->right=NULL;
}
}
扩展:按照中序遍历的顺序将二叉树转换为双向链表。
其方法也是在中序遍历的基础上修改节点。
TreeNode * bintreeToList2(TreeNode *x)
{
stack<TreeNode *> stk;
TreeNode *node=x;
TreeNode *res=NULL;
TreeNode *pre=NULL;
int flag=1;
while(node != NULL || !stk.empty())
{
while( node !=NULL)
{
stk.push(node);
node=node->left;
}
node=stk.top();
if( flag==1)
{
res=node; //保存头结点
flag=0;
}
if(pre!=NULL)
pre->right=node; //就是这里前一个节点指向栈的下一个,而不是原来的
node->left=pre;
pre=node ; //更新前一个节点
node=node->right ; //查找右半部分
stk.pop();
}
return res;
}