首页 > 代码库 > 二叉树遍历

二叉树遍历

 

1.首先是二叉树的建立

先序递归建立一个 建立一个二叉树 用#表示空

void CreatTree(BitNode **root){    char ch;    scanf("\n%c",&ch);    if(ch == #)        *root = NULL;    else    {        *root = (BitNode *)malloc(sizeof(BitNode));        (*root)->data =http://www.mamicode.com/ ch;        printf("%cleft child:",ch);        CreatTree(&(*root)->lchild);        printf("%cright child:",ch);        CreatTree(&(*root)->rchild);    }}

 

2. 运用递归的思想遍历二叉树, 这种方法最为简单。 

void PreOrder(BitNode *root){    if(root == NULL)    {        return;    }    printf("%c ",root->data);    PreOrder(root->lchild);
PreOrder(root->rchild); }

3.借助栈 可以实现非递归方法

 

思路: 按照我们的遍历方法走二叉树

1)  一直向左 (至叶子节点-> 左右都是NULL)

2) 弹栈 回退一个节点 向右走一步后继续  ( 再重复 1~2 步骤至栈空)

 

 

 

//前序非递归
void PreOrder_Nonrecrusive(pBittree T){ if(!T) return ; stack<pBittree> s; pBittree p= T; while(p != NULL || !s.empty()) { while(p != NULL) { cout << p->data << " "; s.push(p); p = p-> lchild; } if(!s.empty()) { p = s.top(); s.pop(); p = p->rchild; } }}

 

 

后续非递归: 

遍历过程相似:

因为后续非递归方法是先访问左子树,再访问右子树,最后访问根节点,用栈储存时必须分清反悔跟节点是做还是右,所以需要一个辅助指针r;指向其最近访问节点。 也可增加一个标识域;

void PostOrder_Nonrecresive(pBittree T){    stack<pBittree> s;    pBittree p = T, r = NULL, temp;    while(p || !s.empty())    {        if(p)        {            s.push(p);            p = p->lchild;        }        else        {            p = s.top();            if(p->rchild && p->rchild != r )            {                p = p->rchild;                s.push(p);                p = p->lchild;            }            else            {                p = s.top();                s.pop();                cout << p->data << " ";                r = p;                p = NULL;            }        } //else    }  //while}

  

二叉树遍历