二叉树的遍历(递归和非递归)

二叉树的遍历一向是数据结构的一个重要的知识点,而且在面试中往往会考到,有必要注意一下,掌握它的思想,就很容易了。

1.先序遍历(“根结点-左孩子-右孩子”)

1 void preOrder1(BinTree *root)     //递归前序遍历 
2 {
3     if(root!=NULL)
4     {
5         cout<<root->data<<" ";
6         preOrder1(root->lchild);
7         preOrder1(root->rchild);
8     }
9 }
 1 void preOrder2(BinTree *root)     //非递归前序遍历 
 2 {
 3     stack<BinTree*> s;
 4     BinTree *p=root;
 5     while(p!=NULL||!s.empty())
 6     {
 7         while(p!=NULL)
 8         {
 9             cout<<p->data<<" ";
10             s.push(p);
11             p=p->lchild;
12         }
13         if(!s.empty())
14         {
15             p=s.top();
16             s.pop();
17             p=p->rchild;
18         }
19     }
20 }

2.中序遍历(“左孩子-根节点-右孩子”)

1 void inOrder1(BinTree *root)      //递归中序遍历
2 {
3     if(root!=NULL)
4     {
5         inOrder1(root->lchild);
6         cout<<root->data<<" ";
7         inOrder1(root->rchild);
8     }
9 } 
 1 void inOrder2(BinTree *root)      //非递归中序遍历
 2 {
 3     stack<BinTree*> s;
 4     BinTree *p=root;
 5     while(p!=NULL||!s.empty())
 6     {
 7         while(p!=NULL)
 8         {
 9             s.push(p);
10             p=p->lchild;
11         }
12         if(!s.empty())
13         {
14             p=s.top();
15             cout<<p->data<<" ";
16             s.pop();
17             p=p->rchild;
18         }
19     }    
20 } 

3.后序遍历(左孩子-右孩子-根节点)

void postOrder1(BinTree *root)    //递归后序遍历
{
    if(root!=NULL)
    {
        postOrder1(root->lchild);
        postOrder1(root->rchild);
        cout<<root->data<<" ";
    }    
} 
 1 void postOrder2(BinTree *root)    //非递归后序遍历
 2 {
 3     stack<BTNode*> s;
 4     BinTree *p=root;
 5     BTNode *temp;
 6     while(p!=NULL||!s.empty())
 7     {
 8         while(p!=NULL)              //沿左子树一直往下搜索,直至出现没有左子树的结点 
 9         {
10             BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
11             btn->btnode=p;
12             btn->isFirst=true;
13             s.push(btn);
14             p=p->lchild;
15         }
16         if(!s.empty())
17         {
18             temp=s.top();
19             s.pop();
20             if(temp->isFirst==true)     //表示是第一次出现在栈顶 
21              {
22                 temp->isFirst=false;
23                 s.push(temp);
24                 p=temp->btnode->rchild;    
25             }
26             else                        //第二次出现在栈顶 
27              {
28                 cout<<temp->btnode->data<<" ";
29                 p=NULL;
30             }
31         }
32     }    
33 } 

 


 

posted on 2014-08-06 21:45  小双V小飞  阅读(107)  评论(0)    收藏  举报

导航