二叉树的遍历

Posted Ivan B.G. Liu

tags:

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

二叉树的前序遍历:

(1)基本原理:首先访问当前节点,然后遍历左子树,最后遍历右子树。

(2)代码实现:

  void preordertravel(vector<int> & vi, TreeNode *root)
    {
        if(root == NULL)
            return;
        vi.push_back(root->val);
        cout<<root->val;
        preordertravel(vi,root->left);
        preordertravel(vi,root->right);
    }

二叉树的中序遍历:

(1)基本原理:首先遍历左子树,然后访问当前节点,最后遍历右子树。

(2)代码实现:

    /*递归的中序遍历*/
    void inordertravel(vector<int> & vi, TreeNode * root)
    {
        if(root == NULL)     //递归结束的边界条件
            return;
        inordertravel(vi,root->left);
        cout<<root->val;
        vi.push_back(root->val);
        inordertravel(vi,root->right);
    }

    /*非递归的中序遍历*/
    void inordertravel(vector<int> & vi, TreeNode * root)
    {
          TreeNode *tmp = root;
          stack<TreeNode *> si;
          while(!si.empty() || tmp!=NULL)
          {
              //找到最底下的左子叶
              while(tmp)
              {
                  si.push(tmp);
                  tmp = tmp->left;
              }
              //当tmp沉到底后,出栈(出的是最底下的左子叶)
              if(!si.empty())
              {
                  tmp = si.top();
                  si.pop();
                  cout<<root->val;
                  vi.push_back(tmp->val);
                  //进入最底下左子叶的右子叶,开始新的循环
                  tmp = tmp->right;
              }
          }
    }

二叉树的后序遍历:

(1)基本原理:首先遍历左子树,然后遍历右子树,最后访问当前节点。

(2)代码实现:

   void postordertravel(vector<int> & vi, TreeNode *root)
    {
        if(root == NULL)
            return;
        postordertravel(vi,root->left);
        postordertravel(vi,root->right);
        cout<<root->val;
        vi.push_back(root->val);
    }

二叉树的层序遍历:

(1)基本原理:从上到下,一层一层地遍历二叉树。主要运用队列的出队和入队来实现。

(2)代码实现:

vector<vector<int>> levelOrder(TreeNode * root)
{
    vector< vector<int> > vvi;
    if(root == NULL)
        return vvi;
    queue<TreeNode *> qt;
    qt.push(root);
    int len = 0;
    while(!qt.empty())
    {
     /*记录该层的元素个数 <---前提是上一层把所有左子树和右子树都压入队列中---> */
        len = qt.size();
        vector<int> lineval;
    /*将每层的所有Node都出队,并将所有Node的左右子树都入队*/
        while(len--)
        {
            cout<<qt.front()->val<<" ";
            lineval.push_back(qt.front()->val);
            if(qt.front()->left != NULL)
                qt.push(qt.front()->left);
            if(qt.front()->right != NULL)
                qt.push(qt.front()->right);
            qt.pop();
        }
        cout<<
        vvi.push_back(lineval);
    }
    return vvi;
}

 

               

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

二叉树的遍历

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

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

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

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

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