算法学习——LeetCode力扣二叉树篇1

算法学习------LeetCode力扣二叉树篇1

144. 二叉树的前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例

示例 1:

输入:root = [1,null,2,3]

输出:[1,2,3]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

示例 4:

输入:root = [1,2]

输出:[1,2]

示例 5:

输入:root = [1,null,2]

输出:[1,2]

提示

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶

递归算法很简单,你可以通过迭代算法完成吗?

代码解析

递归遍历

前后中遍历的前后中,指的是中间节点。

前序遍历 :中左右

后续遍历: 左右中

中序遍历: 左中右

cpp 复制代码
/**
 * 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:
    void Traversal(TreeNode* cur , vector<int> &result)
    {
        if (cur == nullptr) return;
        result.push_back(cur->val);
        Traversal(cur->left , result);
        Traversal(cur->right , result);

    }

    vector<int> preorderTraversal(TreeNode* root) {

        vector<int> result;
        Traversal(root,result);
        return result;
    }
};
非递归遍历
cpp 复制代码
/**
 * 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) {
        vector<int> result;
        stack<TreeNode*> my_stack; 

        if(root == nullptr) return result;

        my_stack.push(root);//前序遍历是中左右,先处理一个中就是root

        while(my_stack.empty() != 1)
        {
            TreeNode* my_node = my_stack.top();//提前中节点
            my_stack.pop();
            //中节点压入结果
            result.push_back(my_node->val);
			//之后将中节点的左右子节点放到栈里,作为未来的中节点
			//压入栈的顺序和弹出栈是相反的,先遍历左再是右,所有先压入右再压入左
            if(my_node->right != nullptr) my_stack.push(my_node->right);
            if(my_node->left  != nullptr) my_stack.push(my_node->left);
        }

        return result;
    }
};

145. 二叉树的后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

示例

示例 1:

输入:root = [1,null,2,3]

输出:[3,2,1]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

提示

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶

递归算法很简单,你可以通过迭代算法完成吗?

代码解析

递归遍历
cpp 复制代码
/**
 * 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:
    void traversal(TreeNode* cur , vector<int> &result)
    {
        if (cur == nullptr) return;
        traversal(cur->left , result);
        traversal(cur->right , result);
        result.push_back(cur->val);

    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};
非递归遍历
cpp 复制代码
/**
 * 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) {
        vector<int> result;
        stack<TreeNode*> my_stack;

        if(root == nullptr) return result;

        my_stack.push(root);

        while(my_stack.empty() != 1)
        {
            TreeNode* my_node = my_stack.top();
            my_stack.pop();
            //和前序一样,但是变成中右左
            result.push_back(my_node->val);
            if(my_node->left != nullptr) my_stack.push(my_node->left);
            if(my_node->right != nullptr) my_stack.push(my_node->right);  
        }
		//反转,变成左右中
        reverse (result.begin() , result.end());
        return result;

    }
};

94. 二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例

示例 1:

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

提示

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶

递归算法很简单,你可以通过迭代算法完成吗?

代码解析

递归遍历
cpp 复制代码
/**
 * 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:
    void traversal(TreeNode* cur , vector<int> &result)
    {
        if(cur==nullptr) return;
        traversal( cur->left , result);
        result.push_back( cur->val);
        traversal( cur->right , result);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};
非递归遍历
cpp 复制代码
/**
 * 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> inorderTraversal(TreeNode* root) {
        
        vector<int> result;
        stack<TreeNode*> my_stack;

        if(root == nullptr) return result;
        TreeNode* cur = root;

        while(cur != nullptr || my_stack.empty() != 1)
        {
            if(cur != nullptr)//找到cur的最左叶子节点
            {
                my_stack.push(cur);//找的过程中所有的左节点都存起来
                cur = cur->left;

            }else//处理中节点和右节点
            {
                cur = my_stack.top();//输出栈里之前存的左节点 ,这时左节点看作成中间节点
                my_stack.pop();

                result.push_back(cur->val);
                cur = cur->right;//然后找刚才输出左节点作为中间点时的右节点
            }

        }       
        return result;

    }
};

102. 二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例

示例 1:

输入:root = [3,9,20,null,null,15,7]

输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]

输出:[[1]]

示例 3:

输入:root = []

输出:[]

提示

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

代码解析

cpp 复制代码
/**
 * 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<vector<int>> levelOrder(TreeNode* root) {

        vector<vector<int>> result;
        TreeNode* node ; //迭代节点
        queue<TreeNode*> my_que; //队列

        if(root == nullptr) return result;
        else // 根节点进队列
        {
            my_que.push(root);
        }

        while(my_que.empty() != 1)
        {
            int size = my_que.size(); //size是不断变化的,指每一层级的点数量
            vector<int> nums;//每一层级存放的点  
            //将每一层的点从队列弹出放入nums,并且下一个层级点放入队列
            for(int i=0 ; i<size ; i++) 
            {
                node = my_que.front(); //该层级的点弹出放入数组
                my_que.pop();
                nums.push_back(node->val);
                //每一个弹出点的下一个层级左右节点压入队列
                if(node->left != nullptr)    my_que.push(node->left);
                if(node->right != nullptr)   my_que.push(node->right);

            }
            result.push_back(nums);
        }
        return result;
    }
};
相关推荐
重生之我要进大厂6 分钟前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
HinsCoder28 分钟前
【渗透测试】——Upload靶场实战(1-5关)
笔记·学习·安全·web安全·渗透测试·测试·upload靶场
听风若依31 分钟前
排序学习笔记
笔记·学习
Filotimo_35 分钟前
【自然语言处理】实验三:新冠病毒的FAQ问答系统
人工智能·经验分享·笔记·python·学习·自然语言处理·pycharm
KBDYD101041 分钟前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
IM_DALLA42 分钟前
【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL21
学习·fpga开发
狐心kitsune44 分钟前
erlang学习:Linux常用命令1
linux·学习·erlang
Crossoads1 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
小游鱼KF1 小时前
Spring学习前置知识
java·学习·spring
自身就是太阳1 小时前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯