Description:
10
/ \
非递归,采用 stack, 来模拟递归。思想的核心其实就是 中序遍历的非递归版本(栈),参考 http://blog.csdn.net/shoulinjun/article/details/19089155
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
二叉搜索树和双向链表的定义与实现参考: http://blog.csdn.net/shoulinjun/article/details/18449445
http://blog.csdn.net/shoulinjun/article/details/18324217
10
/ \
6 14
/ \ / \
4 8 12 16
4=6=8=10=12=14=16
数据结构如下:
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x)
:val(x), left(NULL), right(NULL){}
};
递归:
TreeNode* Convert(TreeNode *root)
{ /* exit */
if(root == NULL) return root;
if(root->right){
root->right = Convert(root->right);
}
if(root->left){
TreeNode *leftHead = Convert(root->left);
TreeNode *leftRear = leftHead;
for(; leftRear->right; leftRear = leftRear->right);
/* merge */
leftRear->right = root;
root->left = leftRear;
root = leftHead;
}
return root;
}
非递归,采用 stack, 来模拟递归。思想的核心其实就是 中序遍历的非递归版本(栈),参考 http://blog.csdn.net/shoulinjun/article/details/19089155
TreeNode *ConvertNonRecur(TreeNode *root)
{
TreeNode *head(NULL), *rear(NULL);
stack<TreeNode*> s;
while(root || !s.empty())
{
while(root){
s.push(root);
root = root->left;
}
root = s.top(); s.pop();
TreeNode *next = root->right;
//insert root into double-linked-list
if(rear){
root->right = rear->right;
rear->right = root;
root->left = rear;
rear = rear->right;
}
else{
head = rear = root;
head->right = head->left = NULL;
}
root = next;
}
return head;
}