二叉树遍历非递归算法——先序遍历

  二叉树是一种很重要的数据结构,在互联网面试笔试中,二叉树都是考察的重点和难点。很多关于二叉树的问题都涉及到了二叉树的遍历,根据二叉树根结点被访问

的顺序,可以将二叉树的遍历分为:先序遍历(根、左、右),中序遍历(左、根、右),后序遍历(左、右、根)。二叉树遍历的算法可以采用递归来实现,也可以采用非递归

的方式来实现。由于采用递归的方式实现二叉树的遍历太简单,因此在这里直接略过,着重掌握二叉树遍历的非递归算法。

  先序遍历二叉树的时候,首先访问根结点,再访问左孩子,最后访问右孩子。在二叉树先序遍历非递归算法中,先将根结点压栈,在栈不为空的时候执行循环:

让栈顶元素p出栈,访问栈顶元素p,如果p的右孩子不为空,则让其右孩子先进栈,如果p的左孩子不为空,则再让其左孩子进栈(注意:进栈顺序一定是先右

孩子,再左孩子)

  二叉树先序遍历的非递归算法实现如下:

  

#include <stdlib.h>
#include <stdio.h>
#define MAXSIZE 100
// 定义结点类型
typedef struct node
{
    int data;
    struct node* lchild;
    struct node* rchild;
} BTnode;

void Preorder(BTnode* t)
{
    BTnode* Seqstack[MAXSIZE];         
    int top = -1;
    BTnode* p;
    
    if(t != NULL)
    {
        top++;
        Seqstack[top] = t;                      // 先将根结点压栈
        while(top > -1)                         // 栈不为空时循环
        {
            p = Seqstack[top];                  // 栈顶元素出栈
            top --;
            printf("%d ", p->data);             // 访问栈顶元素
            if(p->rchild != NULL)               // 如果右孩子不为空,则进栈
            {
                top ++;
                Seqstack[top] = p->rchild;
            }
            if(p->lchild != NULL)               // 如果左孩子不为空,则进栈
            {
                top ++;
                Seqstack[top] = p->lchild;
            }
        }
    }
}

 

posted @ 2017-07-15 14:19  称霸西关一条街  阅读(25911)  评论(0编辑  收藏  举报