二叉树的遍历

二叉树的前序遍历:

(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;
}
               
原文地址:https://www.cnblogs.com/ladawn/p/8463758.html