• 二叉树前序遍历,中序遍历,后序遍历以及层次遍历实现


    一、二叉树的层次遍历

      1. 非递归实现:利用队列,存储每一层次的结点进队列,再通过出队操作完成层次遍历。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<vector<int>> levelOrder(TreeNode* root) {
    13         vector<vector<int>> res;
    14         if(root == NULL)
    15             return res;
    16         queue<TreeNode*> q;
    17         q.push(root);
    18         while(!q.empty())
    19         {
    20             int qnum = q.size();
    21             vector<int> cur;
    22             for(int i=0; i<qnum; i++)
    23             {
    24                 TreeNode* tmp = q.front();
    25                 q.pop();
    26                 cur.push_back(tmp->val);
    27                 if(tmp->left)
    28                     q.push(tmp->left);
    29                 if(tmp->right)
    30                     q.push(tmp->right);
    31             }
    32             res.push_back(cur);
    33         }
    34         return res;
    35     }
    36 };

    2. 递归实现:这里的递归用到了搜索中的bfs。递归函数中需要一个level参数,来确定当前的访问层级。若当前的层级大于等于res数组中的总大小,说明到达新层,需要添加新层。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void levelOrderCore(TreeNode* cur, int level, vector<vector<int>>& res)
    13     {
    14         if(!cur)
    15             return;
    16         if(level >= res.size())
    17         {
    18             res.push_back(vector<int>{});
    19         }
    20         res[level].push_back(cur->val);
    21         levelOrderCore(cur->left, level+1, res);
    22         levelOrderCore(cur->right, level+1, res);
    23     }
    24     vector<vector<int>> levelOrder(TreeNode* root) {
    25         vector<vector<int>> res;
    26         if(root == NULL)
    27             return res;
    28         levelOrderCore(root, 0, res);
    29         return res;
    30     }
    31 };

    二、前序遍历

    1. 非递归实现:借用栈来完成,首先根结点入栈,接下来开始清空栈,对于当前栈顶结点,先入栈右子树,再入栈左子树,这样就可以保证总是先存储左子树,再存储右子树。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> preorderTraversal(TreeNode* root) {
    13         vector<int> res;
    14         if(root == NULL)
    15             return res;
    16         stack<TreeNode*> s;
    17         s.push(root);
    18         while(!s.empty())
    19         {
    20             TreeNode* tmp = s.top();
    21             s.pop();
    22             res.push_back(tmp->val);
    23             if(tmp->right)
    24             {
    25                 s.push(tmp->right);
    26             }
    27             if(tmp->left)
    28             {
    29                 s.push(tmp->left);
    30             }
    31         }
    32         return res;
    33     }
    34 };

    2. 递归实现:DFS

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void preorderCore(TreeNode* cur, vector<int>& res)
    13     {
    14         if(!cur)
    15             return;
    16         res.push_back(cur->val);
    17         preorderCore(cur->left, res);
    18         preorderCore(cur->right, res);
    19     }
    20     vector<int> preorderTraversal(TreeNode* root) {
    21         vector<int> res;
    22         if(root == NULL)
    23             return res;
    24         preorderCore(root, res);
    25         return res;
    26     }
    27 };

    三、中序遍历

    1. 非递归实现:同样利用栈来实现。首先将根结点入栈,再循环将当前结点的左指针入栈,这样保证了栈顶为最左的结点。接下来清空栈的过程中,将当前栈顶的值保存,同时判断其是否存在右子树,若存在,右子树继续之前循环左指针入栈的操作,保证了当前树的中序遍历。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> inorderTraversal(TreeNode* root) {
    13         vector<int> res;
    14         if(root == NULL)
    15             return res;
    16         stack<TreeNode*> s;
    17         TreeNode* tmp = root;
    18         s.push(root);
    19         while(tmp->left)
    20         {
    21             s.push(tmp->left);
    22             tmp = tmp->left;
    23         }
    24         while(!s.empty())
    25         {
    26             TreeNode* cur = s.top();
    27             res.push_back(cur->val);
    28             s.pop();
    29             if(cur->right)
    30             {
    31                 cur = cur->right;
    32                 while(cur)
    33                 {
    34                     s.push(cur);
    35                     cur = cur->left;
    36                 }
    37             }
    38         }       
    39         return res;
    40     }
    41 };

    2. 递归实现:递归的方法很简单,就是先调用当前结点左子树的中序遍历,再将当前结点加入序列,最后调用当前结点右子树的中序遍历。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void inorderCore(TreeNode* cur, vector<int>& res)
    13     {
    14         if(!cur)
    15             return;
    16         inorderCore(cur->left, res);
    17         res.push_back(cur->val);
    18         inorderCore(cur->right, res);
    19     }
    20     vector<int> inorderTraversal(TreeNode* root) {
    21         vector<int> res;
    22         if(root == NULL)
    23             return res;
    24         inorderCore(root, res);
    25         return res;
    26     }
    27 };

    四、后序遍历

    1. 非递归实现:同样利用栈,由于后序遍历的顺序是左右根,可以利用根右左来逆序输出。根右左和前序遍历非常相近,因此只需要改部分代码即可实现。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> postorderTraversal(TreeNode* root) {
    13         vector<int> res;
    14         if(root == NULL)
    15             return res;
    16         stack<TreeNode*> s;
    17         s.push(root);
    18         while(!s.empty())
    19         {
    20             TreeNode* tmp = s.top();
    21             s.pop();
    22             res.push_back(tmp->val);
    23             if(tmp->left)
    24                 s.push(tmp->left);
    25             if(tmp->right)
    26                 s.push(tmp->right);
    27         }
    28         reverse(res.begin(), res.end());
    29         return res;
    30     }
    31 };

    2. 递归实现:根据之前的前序遍历和中序遍历,递归的后序版本也十分简单。先遍历左子树,再遍历右子树,最后将根结点的值保存。

    代码:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void postorderCore(TreeNode* cur, vector<int>& res)
    13     {
    14         if(!cur)
    15             return;
    16         postorderCore(cur->left, res);
    17         postorderCore(cur->right, res);
    18         res.push_back(cur->val);
    19     }
    20     vector<int> postorderTraversal(TreeNode* root) {
    21         vector<int> res;
    22         if(root == NULL)
    23             return res;
    24         postorderCore(root, res);
    25         return res;
    26     }
    27 };
  • 相关阅读:
    CORS跨域漏洞学习
    CVE-2020-0796漏洞复现(RCE)
    Wfuzz使用学习
    DNSlog注入学习
    一些CTF练习记录
    数据结构与算法(十三):赫夫曼树
    数据结构与算法(十二):堆排序
    博客园自定义代码块样式
    Nginx入门(二):常用功能配置
    数据结构与算法(十一):二叉树
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11197619.html
Copyright © 2020-2023  润新知