2011-04-25 20:52:50
例如:{10, 6, 14, 4, 8, 12, 16}的二叉搜索树,求双向链表输出:4=6=8=10=12=14=16
利用递归的特性不难写出Code:
下面是上述方法的改写:
思考:
1. 为什么最后中序遍历是4的循环打印?
2. 为什么这个改写方法不能在调用函数外面保存头结点,即pHead为什么无效?
3. 在调整指针指向的时候,只能修改root指针的left,而不能修改其right指针,否则将造成递归失败。
任何算法有递归解,就一定存在迭代算法,下面是迭代解法,本质上是利用前序遍历的迭代算法求解:
Node* Reconstruct2(Node *root)
{
if (root == NULL)
return NULL;
Node *newRoot = NULL;
Node *pNewRoot = newRoot;
stack<Node *> nstack;
Node *node = root;
while (node != NULL || !nstack.empty())
{
while (node != NULL)
{
nstack.push(node);
node = node->left;
}
node = nstack.top();
if (newRoot == NULL)
{
newRoot = node;
pNewRoot = newRoot;
}
else
{
pNewRoot->right = node;
node->left = pNewRoot;
pNewRoot = node;
}
node = node->right;
nstack.pop();
}
return newRoot;
}