二叉树遍历

 

 
//节点定义
template <class T>
struct binaryTreeNode
{
   T element;
   binaryTreeNode<T> *leftChild,   // left subtree
                     *rightChild;  // right subtree

   binaryTreeNode() {leftChild = rightChild = NULL;}
   binaryTreeNode(const T& theElement):element(theElement)
   {
      leftChild = rightChild = NULL;
   }
   binaryTreeNode(const T& theElement,
                  binaryTreeNode *theLeftChild,
                  binaryTreeNode *theRightChild)
                  :element(theElement)
   {
      leftChild = theLeftChild;
      rightChild = theRightChild;
   }
};template <class T>
void visit(binaryTreeNode<T> *x)
{// visit node *x, just output element field.
   cout << x->element << ' ';
}
//前序遍历(递归算法)
template <class T>
void preOrder(binaryTreeNode<T> *t)
{// Preorder traversal of *t.
   if (t != NULL)
   {
      visit(t);                 // visit tree root
      preOrder(t->leftChild);   // do left subtree
      preOrder(t->rightChild);  // do right subtree
   }
}
//中序遍历
template <class T>
void inOrder(binaryTreeNode<T> *t)
{// Inorder traversal of *t.
   if (t != NULL)
   {
      inOrder(t->leftChild);   // do left subtree
      visit(t);                // visit tree root
      inOrder(t->rightChild);  // do right subtree
   }
}
 //后序遍历
template <class T>
void postOrder(binaryTreeNode<T> *t)
{// Postorder traversal of *t.
   if (t != NULL)
   {
      postOrder(t->leftChild);   // do left subtree
      postOrder(t->rightChild);  // do right subtree
      visit(t);                  // visit tree root
   }
}

//逐层遍历 非递归template <class T>
void levelOrder(binaryTreeNode<T> *t)
{// Level-order traversal of *t.
   queue<binaryTreeNode<T>*> q; //队列
   while (t != NULL)
   {
      visit(t);  // visit t

      // put t's children on queue
      if (t->leftChild != NULL)
         q.push(t->leftChild);
      if (t->rightChild != NULL)
         q.push(t->rightChild);

      // get next node to visit
      try {t = q.front();}
      catch (queueEmpty) {return;}
      q.pop();
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值