二叉树的遍历

强颜欢笑 提交于 2019-12-01 02:27:21

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

 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 } 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!