在二叉树的基本操作里已经说明如何用递归的方法进行二叉树的遍历,那么如何用非递归的方法来进行二叉树的遍历呢,请看下文
1.使用非递归方式进行二叉树的先序遍历
思想:先将根节点入栈然后出栈,继续将右子树先入栈,然后将左子树入栈,因为栈是先进后出的原则,所以左子树后进是先出来的
实现代码:
void TreePreOrderByLoop(TreeNode* root)
{
if(root == NULL)
{
return;
}
//先把根结点入栈
SeqStack stack;
SeqStackInit(&stack);
SeqStackPush(&stack,root);
//循环开始,栈为空时循环结束
TreeNode* cur = NULL;
while(SeqStackTop(&stack,&cur))
{
//取栈顶元素为当前元素。出栈
SeqStackPop(&stack);
//打印当前元素
printf("%c ",cur->data);
//把当前元素的左子树入栈
if(cur->rchild != NULL)
{
SeqStackPush(&stack,cur->rchild);
}
//把当前的右子树入栈
if(cur->lchild != NULL)
{
SeqStackPush(&stack,cur->lchild);
}
}
printf("\n");
return;
}
测试代码:
void TestPreOrderByLoop()
{
TEST_HEADER;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreePreOrderByLoop(root);
}
运行结果:
2.使用非递归方式进行二叉树的中序遍历
实现代码:
void TreeInOrderByLoop(TreeNode* root)
{
if(root == NULL)
{
return;
}
SeqStack stack;
SeqStackInit(&stack);
//定义cur指向根节点
TreeNode* cur = root;
while(1)
{
//循环的判定cur是否为空,如果不为空,就将cur入栈
//并将cur指向cur->lchild
while(cur != NULL)
{
SeqStackPush(&stack,cur);
cur = cur->lchild;
}
//如果cur为空,取栈顶元素,访问出栈
TreeNode* top;
int ret = SeqStackTop(&stack,&top);
if(ret == 0)
{
//说明栈中已经没有元素了
return;
}
printf("%c ",top->data);
SeqStackPop(&stack);
//让cur指向栈顶元素的右子树,重复刚才循环判空的过程