二叉树的遍历

Posted

tags:

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

二叉树的4种遍历方法,包括前序遍历,中序遍历,后序遍历,层次遍历的递归和非递归遍历。

前序遍历:

//递归
vector<int> preorderTraversal(TreeNode* root) {
    vector<int>array;
    traversal(root,array);
    return array;
}
void traversal(TreeNode *root,vector<int>&array){
    if(root==NULL) return ;
    array.push_back(root->val);
    traversal(root->left,array);
    traversal(root->right,array);
}
//非递归
vector<int>preorderTraversal(TreeNode *root){
    vector<int> result;
    if(root==NULL)   return result;
    stack<TreeNode *>tree;
    TreeNode *p=root;
    while(p||!tree.empty()){
       while(p){
           result.push_back(p->val);
           tree.push(p);
           p=p->left;
       }
       if(!tree.empty()){
           p=tree.top();
           tree.pop();
           p=p->right;
       }
    }
    return result;
}

中序遍历:

//递归
vector<int> inorderTraversal(TreeNode* root) {
    vector<int> array;
    traversal(root,array);
    return array;
}
void traversal(TreeNode *root,vector<int> & array){
    if(root==NULL)  return ;
    traversal(root->left,array);
    array.push_back(root->val);
    traversal(root->right,array);
}
//非递归
vector<int> inorderTraversal(TreeNode* root) {
    vector <int> result;
    if(root==NULL)   return result;
    stack<TreeNode *>tree;
    TreeNode *p=root;
    while(p||!tree.empty()){
        while(p){
            tree.push(p);
            p=p->left;
        }
        p=tree.top();
        result.push_back(p->val);
        tree.pop();
        p=p->right;
    }
    return result;
}

中序遍历:

//递归
vector<int>postorderTraversal(TreeNode* root) {
        vector<int>array;
        traversal(root,array);
        return array;
}
void traversal(TreeNode *root,vector<int>&array){
        if(root==NULL)  return;
        traversal(root->left,array);
        traversal(root->right,array);
        array.push_back(root->val);
}
//非递归
vector<int>postorderTraversal(TreeNode* root) {
    vector<int>result;
    if(root==NULL)    return result;
    stack<bool>visited;
    stack<TreeNode *>tree;
    TreeNode *p;
    bool visitr;
    p=root;
    while(p||!tree.empty()){
        while(p){
            tree.push(p);
            visited.push(false);
            p=p->left;
        }
        p=tree.top();
        visitr=visited.top();
        if(!p->right||visitr){
  // 如果节点的右子树为空或者右子树已经访问过,那么就可以访问该节点
            result.push_back(p->val);
            tree.pop();
            visited.pop();
            p=NULL;
        }
        else{
 //右子树不为空并且没有访问过,则将节点标识为访问过右节点
            visited.pop();
            visited.push(true);
            p=p->right;
        }
    }
    return result;
}

层次遍历:

//递归
vector<vector<int>>levelOrder(TreeNode* root) {
    vector<vector<int>>result;
    for(int level=0; ;level++){
        vector<int>levelResult;
        if(!order(root,levelResult,level))
            break;
        result.push_back(levelResult);
    }
return result;
}
int order(TreeNode *root,vector<int>&array,int level){
    if(root==NULL||level<0) return 0;
    if(level==0){
        array.push_back(root->val);
        return 1;
    }
   return order(root->left,array,level-1)
         +
         order(root->right,array,level-1);
}
//非递归
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
vector<int> raw;
if(root==NULL)  return result;
TreeNode * last=root;
queue<TreeNode *> Queue;
Queue.push(root);
while(!Queue.empty()){
    TreeNode * temp=Queue.front();
    Queue.pop();
    raw.push_back(temp->val);
    if(temp->left)
        Queue.push(temp->left);
    if(temp->right)
        Queue.push(temp->right);
    if(temp==last){
        result.push_back(raw);
        raw.clear();
        last=Queue.back();
    }
}
return result;
}

 

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

二叉树的遍历

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

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

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

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

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