[路飞]二叉树的前序遍历、翻转二叉树、 N 叉树的前序遍历

103 阅读2分钟

一.#### 144. 二叉树的前序遍历

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

 

示例 1

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

输入:root = []
输出:[]
示例 3

输入:root = [1]
输出:[1]
示例 4
输入:root = [1,2]
输出:[1,2]

思路:前面有文章解释过二叉树的三种遍历情况,这题是需要前序遍历,就是 根节点 -> 左节点 -> 右节点,这题的解题思路是递归思想,代码如下:

var preorderTraversal = function(root) {
    if(!root) return [];
    let ans = [];
    return _preorder(root,ans);
};

var _preorder = function(root,ans){
    if(!root) return;
    //保存根节点
    ans.push(root.val);
    //遍历左边节点
    _preorder(root.left,ans);
    //遍历右边节点
    _preorder(root.right,ans);
    return ans;
}

二.#### 226. 翻转二叉树


给你一棵二叉树的根节点 `root` ,翻转这棵二叉树,并返回其根节点。
**示例 1:**

输入: root = [4,2,7,1,3,6,9]
输出: [4,7,2,9,6,3,1]

示例 2:

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

示例 3:

输入: root = []
输出: []

思路:这题的解题思路也是递归思想,二叉树也是前序遍历,先将根节点下的左右节点交换,一次遍历替换,代码如下:

 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    if(!root) return root;
    //中间变量保存左节点
    let left = root.left;
    //将左边节点替换成右边节点
    root.left = root.right;
    //右边节点替换成左边节点
    root.right = left;
    //替换后的左边节点依次替换
    invertTree(root.left);
    //替换后的右边节点依次替换
    invertTree(root.right);
    return root;
};

三.#### 589. N 叉树的前序遍历

给定一个 n 叉树的根节点  root ,返回 其节点值的 前序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:

输入: root = [1,null,3,2,4,null,5,6]
输出: [1,3,5,6,2,4]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14] 输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

思路:本题是多叉树前序遍历,根节点 -> 左节点 -> 右节点,跟二叉树类似,二叉树是只有左右节点,多茶树是多个节点,存储在children里,我们只要遍历children就可实现个个遍历,代码如下:

* @param {Node|null} root
 * @return {number[]}
 */
var preorder = function(root) {
    if(!root) return [];
    let ans = [];
    //从根节点开始遍历
    return _preorder(root,ans)
};

var _preorder = function(root,ans){
    if(!root) return;
    //保存根节点
    ans.push(root.val);
    for(let i = 0; i < root.children.length; i ++){
       //遍历每个子节点
        _preorder(root.children[i],ans);
    }
    return ans;
}