首页 > 其他分享 >(第26天)【leetcode题解】226、翻转二叉树 589、N叉树的前序遍历 590、N叉树的后序遍历

(第26天)【leetcode题解】226、翻转二叉树 589、N叉树的前序遍历 590、N叉树的后序遍历

时间:2024-06-05 16:33:42浏览次数:15  
标签:node 遍历 题解 前序 st res root 节点

目录

226、翻转二叉树

题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

思路

  • 题目分析:只需要把每个节点的左右孩子交换一下就可以实现整体翻转的效果。
  • 解法:在遍历过程中,把每个遍历到的节点的左右孩子进行交换。

代码

1.层序遍历

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                TreeNode* tempNode = node -> left;
                node -> left = node -> right;
                node -> right = tempNode;
                if (node -> left) que.push(node -> left);
                if (node -> right) que.push(node -> right);
            }
        }
        return root;
    }
};

2.前序遍历(递归法)

  1. 递归函数的参数和返回值:当前节点的指针、返回root节点的指针
  2. 终止条件:参数代表的当前节点为空时终止
  3. 递归逻辑:前序遍历顺序为中左右,因此先翻转节点、向左递归、向右递归。
class Solution {
public:
    //参数:root代表当前节点
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;//终止条件
        swap(root -> left, root -> right);//中
        invertTree(root -> left);//左
        invertTree(root -> right);//右    
        return root;//返回值
    }
};

3.前序遍历(迭代法)

class Solution {
public:
    //参数:root代表当前节点
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop();
                if (node -> right) st.push(node -> right);//右
                if (node -> left) st.push(node -> left);//左
                st.push(node);//中
                st.push(NULL);//标记
            } else {
                st.pop();//先取出标记
                node = st.top();//中
                st.pop();
                swap(node -> left, node -> right);//翻转
            }
        }
        return root;
    }
};

589、N叉树的前序遍历

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]

思路

1.递归法

  1. 返回值:无;参数:cur指向当前节点的指针、
  2. 终止条件:cur为NULL时
  3. 递归逻辑:前序遍历中左右

2.迭代法

  • 每次遍历到一个节点,先把这个节点的值加入结果集。
  • 为了确保下一个遍历到的节点每次都是当前节点从左到右第一个子节点,把当前节点的所有子节点从右到左压入栈中。
  • 这样每次从栈顶取出元素都能确保是按照前序遍历的顺序。

代码

1.递归法

class Solution {
public:
    //递归函数
    //参数:cur指向当前节点; res结果集
    void helper(Node* cur,vector<int>& res) {
        if (cur == NULL) return;//终止条件
        res.push_back(cur -> val);//中
        //递归逻辑:先顺着每个节点的靠左的子节点递归
        for (Node* & ch : cur -> children) {
            helper(ch, res);
        }
    }

    vector<int> preorder(Node* root) {
        vector<int> res;//结果集
        helper(root, res);
        return res;
    }
};

2.迭代法

class Solution {
public:
    vector<int> preorder(Node* root) {
        vector<int> res;
        if (root == NULL) return res;
        stack<Node*> st;
        st.push(root);
        while (!st.empty()) {
            Node* node = st.top();
            st.pop();
            res.push_back(node -> val);
            for (int i = node -> children.size() - 1; i >= 0; i--) {
                st.push(node -> children[i]);//把当前节点的所有子节点从右到左放入栈中
            }
        }
        return res;
    }
};

590、N叉树的后序遍历

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]

思路

1.递归法

  1. 返回值:无;参数:cur当前节点、res结果集
  2. 终止条件:当前节点cur为NULL时
  3. 递归逻辑:左右中,先通过递归,到最底层的最左边的节点,然后开始把节点值加入结果集。

2.迭代法

  1. 按照上面前序遍历的模板,把子节点压入栈的顺序颠倒一下(从右到左压入栈变成从左到右压入栈),那么最终结果集中的顺序为中右左
  2. 在把结果集翻转一下,顺序就变成了左右中,为后序遍历的顺序。

代码

1. 递归法

class Solution {
public:
    //递归函数
    //参数:cur当前节点、res结果集
    void helper(Node* cur, vector<int>& res) {
        if (cur == NULL) return;//终止条件
        for (Node* ch : cur -> children) {
            helper(ch, res);
        }
        res.push_back(cur -> val);//中
    }

    vector<int> postorder(Node* root) {
        vector<int> res;
        helper(root,res);
        return  res;
    }
};

2.迭代法

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> res;
        stack<Node*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            Node* node = st.top();
            st.pop();
            res.push_back(node -> val);//中
            for (Node* ch : node -> children) {
                st.push(ch);//把当前节点的所有子节点从左到右压入栈中
            }
        }
        reverse(res.begin(), res.end());//将结果集翻转
        return res;
    }
};

思考总结

  1. 树的操作都要在遍历的基础上,在遍历的过程中添加某些操作。
  2. 二叉树节点定义:
struct TreeNode {
		int val;
		TreeNode* left;
		TreeNode* right;
		TreeNode(int x) : val(x), left(NULL), right(NULL)
	};

创建二叉树节点时要用new TreeNode(num)
3. 递归三要素:确定参数和返回值、确定终止条件、确定递归逻辑
4. 树的迭代遍历:深度优先遍历离不开、广度优先遍历离不开队列

标签:node,遍历,题解,前序,st,res,root,节点
From: https://blog.csdn.net/m0_73755059/article/details/139469797

相关文章

  • Codeforces Round 949题解(A、B、C)
    A.TurtleandPiggyArePlayingaGame首先\(p\)选\(2\)的话除得最慢,得的分多。考虑二进制表示,如果\(x=(1000000000)_{bin}\),则每次除以\(2\)都是相当于右移一位,除完之后仍然是\(2\)的倍数,变成\(1\)的步数就是把最高位的\(1\)移动到\(0\)位的步数。因为\(2l\ler\),所以\(l......
  • P8125 [BalticOI 2021 Day2] The short shank 题解
    首先会发现若\(t_i<=T\)的话那么他最终一定会造反。我们只考虑\(t_i>T\)的情况。设\(lst_i\)表示\(i\)左边第一个可以影响(使他造反)到\(i\)的位置,那么我们一定要在\([lst_i,i]\)这个区间中的某一个位置放上床垫才能使\(i\)不造反。这样有一个\(O(nd)\)的dp,但......
  • 2024年03月 GESP等级认证Python编程(一级)试题解析
    【单选题】(每题2分)1、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?()A、小程序   B、计时器   C、操作系统   D、神话人物   正确答案:C2、中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是?()A、制......
  • 二叉树遍历 和 线索二叉树
    文章目录1.1二叉树遍历1.1前提问题1:什么叫二叉树的遍历?二叉树的三种遍历:三个概念:遍历和访问和经过重要概念:遍历过程中的经过节点,不代表访问节点问题2:遍历和访问的联系?问题3:这个有顺序的编号的意义是什么?问题4:什么是访问?如何对节点进行访问?1.2二叉树遍历代码:二......
  • Codeforces Round 950 (Div. 3)个人题解(A~F1)
    CodeforcesRound950(Div.3)个人题解(A~F1)题解火车头#define_CRT_SECURE_NO_WARNINGS1#include<iostream>#include<vector>#include<algorithm>#include<set>#include<unordered_map>#include<cstring>#include<cstdio&......
  • 按按钮题解
    按按钮题解在量体温,打不了代码,来写题解。赞美lwq,三句话让我跟上了课堂节奏。题意数轴\(n\)个按钮,第\(i\)个按钮在坐标\(i\)。有\(m\)次询问,\(i\)询问为在时刻\(t_i\)按下\(b_i\)。可以在时刻\(0\)安排一些机器人,机器人可以花\(1\)单位时间向左或右移动\(1\)......
  • acwing329 围栏障碍训练场 题解
    考试压轴题,意识到这题是线段树优化\(dp\)时追悔莫及。为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。想到设\(dp_{i,j}\)表示在第\(i\)层,奶牛们在\(j\)列时的最小移动范围,则转移方程为(设输入为\(l,r\)):\[\begin{cases}dp_{i,j}=dp_{......
  • C++U7-07-图的遍历进阶
    学习目标 引例 深搜遍历     [【图的遍历进阶】有向图中的可达]【算法分析】从a点广搜,并用vis数组标记从a能够到达的点,如果visb​=true,则表示能够到达,否则反之。【参考代码】#include<bits/stdc++.h>usingnamespacestd;constintm......
  • 会前会后系统Q&A:董事会管理工具相关问题解答
    不同企业在购买董事会管理工具时,都会带有不同的功能需求,希望能够借此提升本企业的董事会管理效率和质量。作为垂直领域的专业SaaS工具,会前会后针对董事会的工作流程研发,符合董事会成员的使用系统,在董事履职、董事会管理中提供颇多助力。下面是关于会前会后系统董事会管理工具......
  • Codeforces Round 949 (Div. 2) 中文题解
    A对于一个特定的\(x\),Piggy总是会选择\(p\)使得\(p\)是质数,所以分数就是\(x\)的质因子个数。容易发现至少有\(t\)个质因子的数是\(2^t\)。最大的满足\(2^t\ler\)的整数\(t\)是\(\left\lfloor\log_2r\right\rfloor\)。又因为\(2l\ler\),所以\(\log_2l+......