二叉树 ~ 非递归三种遍历方式

树的遍历有两个基本的方法:深度优先遍历 和 广度优先遍历 。

首先定义一个二叉树结构体:

typedef struct BTreeNode  
{  
    int value;  
    BTreeNode *left;  
    BTreeNode *right;  
}BTreeNode, *BTree;  

先序遍历(前序遍历) 【根左右】

这里写图片描述

以上图为例先序遍历的顺序是:ADCDEFGHK

递归方法:

void PreOrderR(BTree pRoot)  
{  
    if (NULL == pRoot) {
        return; 
    }
    printf("%d\n", pRoot->value);  
    PreOrderR(pRoot->left);  
    PreOrderR(pRoot->right);  
}  

非递归~

void PreOrder(BTree pRoot)  
{  
    stack<BTree> s;  
    BTree p = pRoot;  
    while (p || !s.empty()) {
         if (p != NULL) {
              s.push(p);  
              printf("%d\n", p->value);   
              p = p->left;  
         }
        else {
            p = s.top();  
            s.pop();  
            p = p->right;  
        }
    }
}  

中序遍历 【左根右】:BDCAEHGKF

递归:

//递归方法  
void InOrderR(BTree pRoot)  
{  
    if (pRoot== NULL) {
        return;
    }
    InOrderR(pRoot->left);  
    printf("%d\n", pRoot->value);   
    InOrderR(pRoot->right);  
}  

非递归方法

void InOrder(BTree pRoot)  
{  
    stack<BTree> s;  
    BTree p = pRoot;  
    while (p || !s.empty()) {  
        if (p != NULL) {  
            s.push(p);  
            p = p->left;  
        }  
        else {  
            p = s.top();  
            printf("%d\n", p->value);   
            s.pop();  
            p = p->right;  
        }  
    }  
}  

后序遍历【左右根】:DCBHKGFEA

扫描二维码关注公众号,回复: 1471055 查看本文章

递归方法:

void PostOrderR(BTree pRoot)  
{  
    if (pRoot== NULL) {  
        return;  
    }  
    PostOrderR(pRoot->left);  
    PostOrderR(pRoot->right);  
    printf("%d\n", pRoot->value);    
} 

非递归方法:

void postOrder(BTree pRoot)  
{  
    stack<BTree> s;  
    BTree cur;  
    BTree pre = NULL;  
    s.push(pRoot);//根结点入栈  
    while(!s.empty()) {  
        cur = s.top();  
        if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))) {  
            //左孩子和右孩子同时为空,或者当前结点的左孩子或右孩子已经遍历过了  
            cout<<cur->value<<" ";  
            s.pop();  
            pre = cur;  
        }  
        else {  
            if(cur->right != NULL) {
                s.push(cur->right);
            }  
            if(cur->left != NULL) {
                s.push(cur->left);  
            } 
        }  
    }  
} 

以上,欢迎留言交流~

猜你喜欢

转载自blog.csdn.net/breakpoints_/article/details/80483093