【数据结构】二叉树的遍历

二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作 二叉查找树 和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

 

二叉树的遍历包括深度优先和宽度优先,深度优先又有前序,中序遍历和后序遍历三种。

对于深度优先遍历,递归遍历方法直观而简洁,如果要使用非递归方法,一般要借用栈结构;

宽度优先则常使用队列来实现。

 

#include 

 using namespace std;

 

 template

 class TreeNode

 {

 protected:

     TreeNode* left;

     TreeNode* right;

 public:

     T data;

 

     TreeNode (const T& item, TreeNode *lptr,TreeNode *rptr):

         data(item), left(lptr), right(rptr)    {}

     virtual ~TreeNode() {}

     TreeNode* Left() const    {

         return left;

     }

     TreeNode* Right() const {

         return right;

     }

 

     //递归遍历

     void Preorder(TreeNode *const node )const ;

     void Inorder(TreeNode  *const node )const ;

     void Postorder(TreeNode *const node)const;

 

     void Preorder() {

         Preorder(this);

     }

     void Inorder() {

         Preorder(this);

     }

     void Postorder() {

         Preorder(this);

     }

     //非递归遍历

     void PreTraverse(TreeNode *const node )const ;

     void InTraverse(TreeNode  *const node )const ;

     void PostTraverse(TreeNode *const node)const;

 

     void PreTraverse() {

         PreTraverse(this);

     }

     void InTraverse() {

         InTraverse(this);

     }

     void PostTraverse() {

         PostTraverse(this);

     }

 };

 

 // preorder recursive scan of the nodes in a tree

 template 

 void TreeNode::Preorder (TreeNode *const t) const

 {

     if (t != NULL) {

         cout << t->data << " "; // visit the node

         Preorder (t->Left());   // descend left

         Preorder (t->Right());  // descend right

     }

 }

 

 // inorder recursive scan of the nodes in a tree

 template 

 void TreeNode::Inorder (TreeNode*const t) const

 {

     if (t != NULL) {

         Inorder (t->Left());    // descend left

         cout << t->data << " ";                        // visit the node

         Inorder (t->Right());  // descend right

     }

 }

 

 // postorder recursive scan of the nodes in a tree

 template 

 void TreeNode::Postorder (TreeNode *const t) const

 {

     if (t != NULL) {

         Postorder (t->Left());  // descend left

         Postorder(t->Right()); // descend right

         cout << t->data << " "; // visit the node

     }

 }

 

 template

 void TreeNode::PreTraverse(TreeNode *const node ) const

 {

     if (node == NULL)

         return;

     TreeNode *t = node;

     stack< TreeNode* > s;

     s.push(t);

     while (! s.empty()) {

         t = s.top();

         s.pop();

         cout << t->data << " ";

         if(t->right != NULL)

             s.push(t->right);

         if(t->left != NULL)

             s.push(t->left);

     }

 }

 template

 void TreeNode::InTraverse(TreeNode *const node ) const

 {

     if (node == NULL)

         return;

     TreeNode *t = node;

     stack< TreeNode* > s;

     do {

         while(t != NULL) {

             s.push(t);

             t = t->left;

         }

         t = s.top();

         s.pop();

         cout << t->data << " ";

         t = t->right;

     } while (!s.empty()|| t!=NULL);

 }

 template

 void TreeNode::PostTraverse(TreeNode *const node ) const

 {

     stack<TreeNode* > s;

     stack sf;

     TreeNode *t = node;

     int flag;

     while (!s.empty() || t!=NULL){

         while (t!=NULL){

             s.push(t);

             sf.push(0);

             t = t->left;

         }

         t = s.top(),s.pop();

         flag = sf.top(),sf.pop();

         if (flag == 0) {

             s.push(t);

             sf.push(1);

             t =  t->right;

         }else {

             cout << t->data << " ";

             t = NULL;

         }

     }

 }一个简单的测试程序
 1  int main()
 2 {
 3     TreeNode< int> n1( 10,NULL,NULL);
 4     TreeNode< int> n2( 9,NULL,NULL);
 5     TreeNode< int> n3( 6,&n1,&n2);
 6     TreeNode< int> n4( 7,NULL,NULL);
 7     TreeNode< int> n5( 8,NULL,NULL);
 8     TreeNode< int> n6( 3,&n4,&n5);
 9     TreeNode< int> n7( 1,&n3,&n6); 
10 
11     n7.PreTraverse(); cout << endl; 
12     n7.InTraverse();  cout << endl; 
13     n7.PostTraverse();cout << endl;  
14 
15     system( " pause ");
16      return  0;
17 }

 

你可能感兴趣的:(数据结构)