示例:

中序遍历上图中的二叉树,转换后的双向链表为:4⇆6⇆8⇆10⇆12⇆14⇆16。
代码:
class Solution {
public:
TreeNode* inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
//p为当前遍历结点,prev为当前结点的前一个结点
//head指向双向链表的第一个结点,tail指向双向链表的最后一个结点
TreeNode* p=root,prev=NULL,head=NULL,tail=NULL;
while(!s.empty() || p!=NULL){
if(p!=NULL){
s.push(p);
p=p->left;
}
else{
p = s.top();
s.pop();
if(head==NULL) head = p;
if(prev!=NULL) prev->right = p;
p->left = prev;
prev = p;
tail = p; //每次循环都使tail指向最后一个结点
p=p->right;
}
}
//输出验证一下
while(head!=NULL){
cout<<head->val<<endl;
head = head->right;
}
while(tail!=NULL){
cout<<tail->val<<endl;
tail = tail->left;
}
return head; //返回头结点
}
};