zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    二叉树的前序遍历:

    (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;
    }
                   
  • 相关阅读:
    PHP遍历数组元素
    In PHP5, what is the difference between using self and $this? When is each appropriate?
    了解如何构建 Metro 样式的应用程序
    HTML5在路上
    meta 之 viewport
    dede数据库连接文件
    windows 环境安装wamp软件实现php开发环境
    域名空间那些事
    Javascript编程风格
    apache 服务器修改网站默认首页
  • 原文地址:https://www.cnblogs.com/ladawn/p/8463758.html
Copyright © 2011-2022 走看看