您的位置:首页 > 其它

遍历二叉树的非递归实现

2015-11-16 22:34 363 查看
对于二叉树来说,只要按照下面的模板可以很容易地实现先序、中序和后序的递归遍历二叉树。

void visit(TreeNode *node)
{
//operation 1
if (node->leftChild != nullptr)
visit(node->leftChild);
//operation 2
if (node->rightChild != nullptr)
visit(node->rightChild);
//operation 3
}


使用递归可以使代码变得简洁,明了。我们不用考虑计算机底层的递归工作栈是怎么实现的,只要写好递归式,给出递归终止条件,就可以把剩余的计算工作交给计算机去执行。所以说递归是个好东东啊。但是追求真相的人,往往不会满足于此的,一定弄明白背后的工作原理。

哈哈这就是古人云:"不可去名上理会。须求其所以然。"

OK,下面我把今晚写的遍历二叉树的非递归算法分享一下。

TreeNode *assistStack[MAXSIZE];//辅助栈模拟系统的递归工作栈
bool visited[MAXSIZE] = { false };//设置访问标志位
void visit(char value)
{
printf("%c ", value);
}

void preOrderOfNonRecurrence(TreeNode *root)
{
int top = -1;
TreeNode *rNode = root;
visit(rNode->value);
assistStack[++top] = rNode;

while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
printf("%c ", rNode->value);
assistStack[++top] = rNode;
}

while (top != -1)
{
if (assistStack[top]->rightChild != nullptr)
{
rNode = assistStack[top]->rightChild;
top--;
printf("%c ", rNode->value);
while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
printf("%c ", rNode->value);
assistStack[++top] = rNode;
}
}
else
{
top--;
}

}
}

void inOrderOfNonRecurrence(TreeNode *root)
{
TreeNode *rNode = root;
int top = -1;
assistStack[++top] = rNode;
while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
assistStack[++top] = rNode;
}

while (top != -1)
{
rNode = assistStack[top--];
visit(rNode->value);
if (rNode->rightChild != nullptr)
{
rNode = rNode->rightChild;
assistStack[++top] = rNode;
while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
assistStack[++top] = rNode;
}
}
}

}

void postOrderOfRecurrence(TreeNode *root)
{
TreeNode* rNode = root;
int top = -1;
assistStack[++top] = rNode;
visited[top] = false;
while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
assistStack[++top] = rNode;
visited[top] = false;
}

while (top != -1)
{
rNode = assistStack[top];
visited[top] = true;
if (rNode->rightChild != nullptr)
{
rNode = rNode->rightChild;
assistStack[++top] = rNode;
visited[top] = false;
while (rNode->leftChild != nullptr)
{
rNode = rNode->leftChild;
assistStack[++top] = rNode;
visited[top] = false;
}
}

while (visited[top] == true && top != -1)
{
visit(assistStack[top]->value);
top--;
}

}
}


由于时间原因,没有来得及加注释,以后补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: