搜索

day26


发布时间: 2022-11-24 21:17:00    浏览次数:71 次

【144.二叉树的前序遍历】
【145.二叉树的后序遍历】
【94.二叉树的中序遍历】

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<int> st;
        vector<int> result;
        if (root == NULL)   
            return result;
        result.push_back(root->val);
        preorderTraversal(root->right);
        preorderTraversal(root->left);
        return result;
    }
};
  • 递归---调用自己这个函数,不需要别的数据结构 迭代---本题需要的是栈
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL)   
            return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);
            if (node->right)
                st.push(node->right);
            if (node->left)
                st.push(node->left);
        }
        return result;
    }
};
  • 迭代版 好难懂啊
    • stack<TreeNode*> st; 栈 可不是一般的栈 而是存放结点指针的栈
    • 先搁着 下次看
  • 不行。。。今天得看:)
  • 先序遍历
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL)   
            return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            result.push_back(node->val);
            st.pop();
            if (node->right)  st.push(node->right);
            if (node->left) st.push(node->left);
        } 
        return result;
    }
};
  • 看了视频讲解 这次模仿着写过了 注意以下几点

    • 前提是 清楚 1)何时 用栈pop()push() 实现结点的访问/遍历 2)何时 将结点的->val值放入result数组 3)注意定义式的数据结构 (------至于为什么选择这样的数据结构原因见下)stack<TreeNode*> st; vector<int> result;

      • 答:当栈不为空的时候 pop出栈顶元素、把栈顶元素->val值存入结果数组、按序push进去右孩子、左孩子
    • 思路就是 首先把输入参数根节点(不为空的话)push到栈中(因此该句之前加入一个为空判断 为空的话直接返回return result ------为什么不是return 呢 因为你看所在的函数返回类型是vector 类型啊 如果你写的是return的话就表示无返回值) 然后进入while栈不为空的循环:

      • 首先用一个当前结点记下栈.top()元素(注意栈里存的不是常见的int类型而是结点指针类型TreeNode*类型 --------为什么不是int类型呢 因为本题就是对结点操作的结点指针类型所包含的信息比单纯一个int类型更丰富 --------为什么不是节点类型TreeNode呢 因为结点指针不占空间不用delete呀)(因此该临时变量也应该是Tree *类型)
      • 把这个当前结点从栈中pop出来
      • 把这个当前结点->val值 存入Result数组中(注意用result.push_back()函数)(注意存入的是结点->val值 是int类型 而不是TreeNode* 类型)
      • 如果当前结点有右孩子 则把右孩子入栈
      • 如果当前节点有左孩子 则把左孩子入栈
    • 循环结束 return result

  • 后序遍历--diedaifa

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL)   return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* curr = st.top();
            st.pop();
            result.push_back(curr->val);
            if (curr->left) st.push(curr->left);
            if (curr->right) st.push(curr->right);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};
  • 把握思路 前序遍历迭代法基础上两点改进
    • 交换放入右孩子、左孩子的先后顺序
    • 最后的结果数组进行反转
      • 注意反转语句 reverse(result.begin(),result.end());
  • 中序遍历-----迭代法有些不一样 明天做

明天继续:)

免责声明 day26,资源类别:文本, 浏览次数:71 次, 文件大小:-- , 由本站蜘蛛搜索收录2022-11-24 09:17:00。此页面由程序自动采集,只作交流和学习使用,本站不储存任何资源文件,如有侵权内容请联系我们举报删除, 感谢您对本站的支持。 原文链接:https://www.cnblogs.com/deservee/p/16923363.html