遍历二叉树的各种操作(非递归遍历)

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序、中序、后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度、结点数。

#include<iostream> 
#include<queue> 
#include<stack> 
using namespace std; 
 
//二叉树结点的描述 
typedef struct BiTNode

    char data; 
    struct BiTNode *lchild, *rchild;      //左右孩子 
}BiTNode,*BiTree; 
 
//按先序遍历创建二叉树 
//BiTree *CreateBiTree()    //返回结点指针类型 
//void CreateBiTree(BiTree &root)      //引用类型的参数 
void CreateBiTree(BiTNode **root)    //二级指针作为函数参数 

    char ch; //要插入的数据 
    scanf("\n%c", &ch);
    //cin>>ch; 
    if(ch=='#')
        *root = NULL;
    else
    {
        *root = (BiTNode *)malloc(sizeof(BiTNode));
        (*root)->data = ch;
        printf("请输入%c的左孩子:",ch);
        CreateBiTree(&((*root)->lchild));
        printf("请输入%c的右孩子:",ch);
        CreateBiTree(&((*root)->rchild));
    }
}
 
//前序遍历的算法程序 
void PreOrder(BiTNode *root)

    if(root==NULL) 
        return ; 
    printf("%c ", root->data); //输出数据 
    PreOrder(root->lchild); //递归调用,前序遍历左子树 
    PreOrder(root->rchild); //递归调用,前序遍历右子树 

 
//中序遍历的算法程序 
void InOrder(BiTNode *root) 

    if(root==NULL)
        return ;
    InOrder(root->lchild); //递归调用,前序遍历左子树 
    printf("%c ", root->data); //输出数据 
    InOrder(root->rchild); //递归调用,前序遍历右子树 

 
//后序遍历的算法程序 
void PostOrder(BiTNode *root)
{
    if(root==NULL)
        return ;
    PostOrder(root->lchild);      //递归调用,前序遍历左子树 
    PostOrder(root->rchild);      //递归调用,前序遍历右子树 
    printf("%c ", root->data);    //输出数据   

 
/*
二叉树的非递归前序遍历,前序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作,
每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
*/ 
void PreOrder_Nonrecursive(BiTree T)    //先序遍历的非递归   

    if(!T)   
        return ;   
   
    stack<BiTree> s; 
    s.push(T); 
 
    while(!s.empty()) 
    { 
        BiTree temp = s.top(); 
        cout<<temp->data<<" "; 
        s.pop(); 
        if(temp->rchild) 
            s.push(temp->rchild); 
        if(temp->lchild) 
            s.push(temp->lchild); 
    } 

void PreOrder_Nonrecursive1(BiTree T)    //先序遍历的非递归
{
 if(!T) 
        return ;
 stack<BiTree> s;
 BiTree curr = T;
 while(curr != NULL || !s.empty())
 {
  while(curr != NULL)
  {
   cout<<curr->data<<"  ";
   s.push(curr);
   curr = curr->lchild;
  }
  if(!s.empty())
  {
   curr = s.top();
   s.pop();
   curr = curr->rchild;
  }
 }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/146aaaa1ffcdbe3b773c769219592d02.html