二叉树的递归与非递归遍历源码(C++)

#include <iostream>
#include <stack>
#include <cassert>
using namespace std;

struct node
{
  node* lchild;
  node* rchild;
  int key;
  node(int data=0, node* left=NULL, node* right=NULL)
  {
    key = data;
    lchild = left;
    rchild = right;
  }
};

class Tree
{
  
public:
  Tree()
  {
    root = NULL;
  }
  Tree(int array[], int size);
  ~Tree();
  void traverse();
  void postTraverse();
  void recur_postTraverse(node* cur);
  void preTraverse();
  void recur_preTraverse(node* cur);
  void inTraverse();
  void recur_inTraverse(node* cur);

private:
  Tree(const Tree& t);
  Tree& operator=(const Tree& t);
  node* createTree(int array[], int size);
  void destroyTree(node* cur);
private:
  node* root;
  
};

Tree::Tree(int array[], int size)
{
  if ((array==NULL)||(size<=0))
    root = NULL;
  else
    root = createTree(array, size);
}

node* Tree::createTree(int array[], int size)
{
  if ((array==NULL)||(size<=0))
    return NULL;
  int mid=size/2;
  node* cur=new node(array[mid]);
  cur->lchild = createTree(array, mid);
  cur->rchild = createTree(array+mid+1, size-mid-1);
  return cur;
}

Tree::~Tree()
{
  destroyTree(root);
}

void Tree::destroyTree(node* cur)
{
  if (cur != NULL)
  {
    destroyTree(cur->lchild);
    destroyTree(cur->rchild);
    delete cur;
  }
  
}


//后序递归遍历

void Tree::recur_postTraverse(node* cur)
{
  if (cur!=NULL)
  {
    recur_postTraverse(cur->lchild);
    recur_postTraverse(cur->rchild);
    cout << cur->key << " ";
  }
}

//先序递归遍历

void Tree::recur_preTraverse(node* cur)
{
  if (cur!=NULL)
  {
    cout << cur->key << " ";
    recur_preTraverse(cur->lchild);
    recur_preTraverse(cur->rchild);
  }
}

//中序递归遍历

void Tree::recur_inTraverse(node* cur)
{
  if (cur!=NULL)
  {
    recur_inTraverse(cur->lchild);
    cout << cur->key << " ";
    recur_inTraverse(cur->rchild);
  }
}

//后序非递归遍历

void Tree::postTraverse()
{
  stack<node*> treeStack;
  node *pre, *cur;
  cur = root;
  pre = NULL;
  
  if (cur!=NULL)
    treeStack.push(cur);
  
  while(!treeStack.empty())
  {
    cur = treeStack.top();
    if (((cur->lchild==NULL)&&(cur->rchild==NULL))|| //没有孩子结点或者

        ((pre!=NULL)&&((pre==cur->lchild)||(pre==cur->rchild)))) //孩子遍历过了

    {
      treeStack.pop();
      cout << cur->key << " ";
      pre = cur;
    }
    else
    {
      if (cur->rchild!=NULL)
        treeStack.push(cur->rchild);
      if (cur->lchild!=NULL)
        treeStack.push(cur->lchild);
    }
   
  }
  
}

//中序非递归遍历

void Tree::inTraverse()
{
  stack<node*> treeStack;
  node *pre, *cur;
  cur = root;
  
  if (cur!=NULL)
    treeStack.push(cur);
  
  while(!treeStack.empty())
  {
    cur = treeStack.top();
    treeStack.pop();
    if (cur == NULL)
      continue;
    if ((cur->lchild==NULL)|| //没有左孩子或者

        ((!treeStack.empty())&&(treeStack.top()==cur->rchild))) //右孩子已经入过栈

      cout << cur->key << " ";
    else
    {
      treeStack.push(cur->rchild);
      treeStack.push(cur);
      if (cur->lchild!=NULL)
        treeStack.push(cur->lchild);
    }
   
  }
}

//先序非递归遍历

void Tree::preTraverse()
{
  stack<node*> treeStack;
  node *pre, *cur;
  cur = root;
  
  if (cur!=NULL)
    treeStack.push(cur);
  
  while(!treeStack.empty())
  {
    cur = treeStack.top();
    treeStack.pop();
    cout << cur->key << " ";
    if (cur->rchild!=NULL)
      treeStack.push(cur->rchild);
    if (cur->lchild!=NULL)
      treeStack.push(cur->lchild);
  }
}


void Tree::traverse()
{
  recur_preTraverse(root);
  cout << endl;
  preTraverse();
  cout << endl << endl;

  recur_inTraverse(root);
  cout << endl;
  inTraverse();
  cout << endl << endl;
  
  recur_postTraverse(root);
  cout << endl;
  postTraverse();
  cout << endl << endl;
}

int main(int argc, char* argv[])
{
  int array[] = {2, 4, 5, 6, 8, 10, 11, 13, 15, 17, 20};
  Tree tr(array, sizeof(array)/sizeof(array[0]));
  tr.traverse();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值