二叉树的遍历

Posted lancelee98

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历相关的知识,希望对你有一定的参考价值。

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

 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 }  

 

以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历

讲透学烂二叉树:二叉树的遍历图解算法步骤及JS代码

二叉树(2.二叉树的遍历和实现)

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

代码题— 二叉树的层次遍历