二叉树的遍历

来源:互联网 发布:安装centos要下载哪些 编辑:程序博客网 时间:2024/06/03 08:37

二叉树的遍历

二叉树的遍历主要分为三种:
  1、前序遍历(根–>左–>右)
  2、中序遍历(左–>根–>右)
  3、后序遍历(左–>右–>根)
  其中对于二叉排序树而言,中序遍历的结果是按序增大的
  以递归的方式来实现三种遍历非常简单,如果要以非递归的方式实现遍历,那么一般需要栈作为辅助结构

1、前序遍历(根–>左–>右)

1.1递归

void preOrder(TreeNode *root){        if(root==NULL)  return;         cout<<root->val<<endl;        preOrder(root->left);        preOrder(root->right);}

1.2非递归

void preOrder(TreeNode *root){        if(root==NULL)  return;        stack<TreeNode *> s;        s.push(root);        while(!s.empty()){                TreeNode *t=s.top();                s.pop();                cout<<t->val<<endl;                if(t->right)    s.push(t->right);                if(t->left)     s.push(t->left);        }}

2、中序遍历(左–>根–>右)

2.1递归

void inOrder(TreeNode *root){        if(root==NULL)  return;        inOrder(root->left);        cout<<root->val<<endl;        inOrder(root->right);}

2.2非递归

void inOrder(TreeNode *root){        stack<TreeNode *> s;        TreeNode *p=root;        while(p||!s.empty()){                while(p){                    s.push(p);                    p=p->left;                }                if(!s.empty()){                    p=s.top();                    s.pop();                    cout<<p->val<<endl;                    p=p->right;        }}

3、后序遍历(左–>右–>根)

3.1递归

void postOrder(TreeNode *root){        if(root==NULL)  return;        postOrder(root->left);        cout<<root->val<<endl;        postOrder(root->right);}

3.2非递归

void postOrder(TreeNode *root){        stack<TreeNode *> s;        TreeNode *p=root;        TreeNode *prev=NULL;        while(p||!s.empty()){            while(p){                s.push(p);                p=p->left;            }            p=s.top();            if(p->right==NULL||p->right==prev){                cout<<p->val<<endl;                s.pop();                prev=p;                p=NULL;            }else{                p=p->right;            }        }}


4、树的层次遍历

4.1层次遍历,每一层按序输出
以一个队列作为辅助结构,在每一层的末尾插入一个NULL指针来分隔每一层
这里写图片描述

vector<vector<int>> levelOrder(TreeNode* root) {        queue<TreeNode*>    q;        vector<vector<int> > ret;        if(root==NULL)  return ret;        q.push(root);        q.push(NULL);        TreeNode *p=NULL;        vector<int> tmp;        while(!q.empty()){            p=q.front();            q.pop();            if(p==NULL&&q.empty()){                if(!tmp.empty())    ret.push_back(tmp);                return ret;            }else if(p==NULL){                ret.push_back(tmp);                tmp.clear();                q.push(NULL);            }else{                tmp.push_back(p->val);                if(p->left) q.push(p->left);                if(p->right)    q.push(p->right);            }         }        return ret;    }

4.2层次遍历,以zig-zag的形式输出
以两个栈作为辅助结构
这里写图片描述

vector<vector<int>> zigzagLevelOrder(TreeNode* root) {        vector<vector<int> > ret;        if(root==NULL)  return ret;        stack<TreeNode *> s[2];        int i=0;        s[i].push(root);        vector<int> tmp;        TreeNode *p=NULL;        while(!s[i].empty()){            while(!s[i].empty()){                p=s[i].top();                s[i].pop();                tmp.push_back(p->val);                if(!i){                    if(p->left) s[!i].push(p->left);                    if(p->right)    s[!i].push(p->right);                }else{                    if(p->right)    s[!i].push(p->right);                    if(p->left) s[!i].push(p->left);                }            }            if(tmp.size()){                ret.push_back(tmp);                tmp.clear();            }            i=!i;        }        return ret;    }
0 0