二叉树的创建及遍历(递归和非递归C++实现)

代码:

#include <iostream>
#include <stack>
using namespace std;
typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    char data;
}BiTreeNode, *BiTree;

//按照前序顺序建立二叉树(递归)
void createBiTree(BiTree &T)
{
    char c;
    cin >> c;
    if('#' == c)
        T = NULL;
    else
    {
        T = new BiTreeNode;
        T->data=c;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}
//前序遍历二叉树并打印(递归)
void preTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data<<" ";
        preTraverse(T->lchild);
        preTraverse(T->rchild);
    }
}
//非递归前序遍历
void _preTraverse(BiTree T)
{
  stack<BiTree> node_stack;
  while(T!=nullptr||!node_stack.empty()){
    if(T!=nullptr){
      std::cout << T->data << ' ';
      node_stack.push(T);
      T = T->lchild;
    }
    else{
      T = node_stack.top();
      T = T->rchild;
      node_stack.pop();
    }
  }
}
//中序遍历二叉树并打印(递归)
void midTraverse(BiTree T)
{
    if(T)
    {
        midTraverse(T->lchild);
        cout<<T->data<<" ";
        midTraverse(T->rchild);
    }
}
//非递归中序遍历;
void _midTraverse(BiTree T)
{
  stack<BiTree> node_stack;
  while(T!=nullptr||!node_stack.empty()){
    if(T!=nullptr){
      node_stack.push(T);
      T = T->lchild;
    }
    else
    {
      T = node_stack.top();
      std::cout << T->data << ' ';
      T = T->rchild;
      node_stack.pop();
    }
  }
}
//后续遍历二叉树并打印(递归)
void postTraverse(BiTree T)
{
    if(T)
    {
        postTraverse(T->lchild);
        postTraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
//非递归后续遍历;
void _postTraverse(BiTree T)
{
  stack<BiTree> node_stack;
  BiTree thelastvivst = T;
  while (T!=nullptr||!node_stack.empty()) {
    if(T!=nullptr)
    {
      node_stack.push(T);
      T = T->lchild;
    }
    else
    {
      T = node_stack.top();
      if(T->rchild==nullptr||T->rchild==thelastvivst)
      {
        std::cout << T->data << ' ';
        thelastvivst = T;
        node_stack.pop();
      }
      else
      {
        T = T->rchild;
      }
    }
  }
}
int main()
{
    BiTree T;               //声明一个指向二叉树根节点的指针
    createBiTree(T);
    cout<<"二叉树创建完成!"<<'\n';
    cout<<'\n'<<"前序遍历二叉树:"<<'\n';
    preTraverse(T);
    std::cout << '\n'<<"非递归前序遍历:" << '\n';
     _preTraverse(T);
    cout<<'\n'<<"中序遍历二叉树:"<<endl;
    midTraverse(T);
    std::cout <<'\n'<< "非递归中序遍历:" << '\n';
     _midTraverse(T);
    cout<<'\n'<<"后序遍历二叉树:"<<endl;
    postTraverse(T);
    std::cout <<'\n'<< "非递归后序遍历:" << '\n';
     postTraverse(T);
    return 0;
}
 
测试结果:
 

 

 

 
 
posted @ 2020-08-08 02:11  诗和远方*  阅读(628)  评论(0编辑  收藏  举报