码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的遍历

时间:2019-10-10 15:49:28      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:队列   node   树的遍历   span   递归   移除   ast   visit   else   

* 先根序遍历(非递归版)

 1 void PreOrder(TreeNode* root)
 2 { 
 3         stack<TreeNode*> s;
 4         TreeNode *p=root,*last_visit=NULL;
 5         while(p||s.size()>0)
 6         {
 7             if(p)//走到最左 边走边访问 并进栈
 8             {
 9                 cout<<p->val<<endl;
10                 s.push(p);
11                 p=p->left;
12             }
13             else//左边没有节点了
14             {
15                 p=s.top();//弹出上一个节点
16                 s.pop();
17                 p=p->right;//转向右子树
18             }
19         }        
20 }

 

* 中根序遍历(非递归版)

void InOrder(TreeNode* root)
{       
        stack<TreeNode*> s;
        TreeNode *p=root,*last_visit=NULL;
        while(p||s.size()>0)
        {
            if(p)//走到最左
            {
                s.push(p);
                p=p->left;
            }
            else//左边没有节点了
            {
                p=s.top();//弹出上一个节点
                s.pop();
                cout<<p->val<<endl;//访问栈中弹出的节点
                p=p->right;//转向右子树
            }
        }     
}

 

* 后根序遍历(非递归版)

 1 void PostOrder(TreeNode* root)
 2 {
 3         stack<TreeNode*> s;
 4         TreeNode *p=root,*last_visit=NULL;//last_visit指针记录上次访问过的值,因为后根序 根节点最后访问 所以未访问根节点时 根节点还未退栈 所以需要判别右子树是否访问过
 5         while(p||s.size()>0)
 6         {
 7             if(p)//走到最左
 8             {
 9                 s.push(p);
10                 p=p->left;
11             }
12             else//左边没有节点了
13             {
14                 p=s.top();//弹出上一个节点
15                 if(p->right&&p->right!=last_visit)//若上一个节点存在右子树 且 未被访问过 则转向右子树
16                 {
17                     s.push(p->right);//右子树进栈
18                     p=p->right->left;//再转向右子树的左子树
19                 }
20                 else//p的左右子树都不存在才进行访问
21                 {
22                     last_visit=s.top();//记录下来本节点已经访问过了
23                     cout<<s.top()->val<<endl;
24                     s.pop();//将访问过的节点退栈
25                     p=NULL;//指针指向空 下次进来判断栈内下一个元素
26                 }
27             }
28         }       
29 } 

 

* 二叉树的层次遍历(利用队列)

 1 void LevelOrder(TreeNode * root)
 2 {        
 3         queue<TreeNode*> que;//队列
 4         TreeNode* p;
 5         que.push(root);//先将根节点放入队列
 6         while(!que.empty())//队列不空
 7         {
 8             p=que.front();//取出队头结点
 9             cout<<p->val<<endl;//访问队头结点
10             que.pop();//将队头结点从队列中移除
11             if(p->left)//若p存在左子树
12                 que.push(p->left);
13             if(p->right)//若p存在左子树
14             que.push(p->right);
15         }
16 }  

 

二叉树的遍历

标签:队列   node   树的遍历   span   递归   移除   ast   visit   else   

原文地址:https://www.cnblogs.com/lancelee98/p/11647662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!