剑指 Offer 27. 二叉树的镜像

剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

 4

/
2 7
/ \ /
1 3 6 9
镜像输出:

 4

/
7 2
/ \ /
9 6 3 1

示例 1:

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

限制:

0 <= 节点个数 <= 1000

注意:本题与主站 226 题相同:https://leetcode-cn.com/problems/invert-binary-tree/

递归算法思考步骤

首先,分解子问题,将大问题分解成子问题作为递归项来进行递归。

第一步原理,在做递归时,第一步很重要,将第一步与其他步骤分为两类。将子问题变成与大问题形式相同,规模缩小的问题,形成递归。

其次,找到子问题与大问题之间关系,形成递归表达式。

最后,为防止无穷递归,需给出边界条件,当传入的递归项为零时返回值,既作为边界,又作为递归算法每次递归的结果。

解题思路

用递归的方法,对传入的树按照左子树和右子树递归,即分割成更小的规模
为了防止递归函数报错,一开始就要判断当前树是否为空,如果空的话就返回null到上一层,并把这个树接到上一层树的另一分支。
当两个分支的交换完成时,用一个return函数把当前树返回到上一层,上一层又有相应的函数,会把左右节点交换好的当前子树分给父节点的另一边
每个树都要交换它的子树
对应的,每个子树也要交换它的子树
哪怕这个树的两个子树都是空,那也可以进行交换
当这个树本身为空时,说明该退出递归了
最后的最后,当这棵子树的交换完成时,return root,把这棵子树回退到上一层递归

代码实现

package main;

//请完成一个函数,输入一个二叉树,该函数输出它的镜像。(将每个节点的左子树和右子树交换)
//        例如输入:
//             4
//           /   \
//          2     7
//         / \   / \
//        1   3 6   9
//        镜像输出:
//             4
//           /   \
//          7     2
//         / \   / \
//        9   6 3   1
//        示例 1:
//
//        输入:root = [4,2,7,1,3,6,9]
//        输出:[4,7,2,9,6,3,1]
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

class Solution {

    public static class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}
    public  TreeNode mirrorTree(TreeNode root) {

        //从树的根节点往下递归遍历,每次递归都使这个树的规模变小
        //第一次函数的root是整棵树,将树的左右子树交换,并进行递归
        //第二行的函数就是 root.right和root.left,分别给root的左子树和右子树
        //第三行那就是在子树里面递归了



        if (root == null)
            return null;

        TreeNode tmpNode = root.left;
        root.left = mirrorTree(root.right);
        root.right = mirrorTree(tmpNode);

        return root;
    }

    public static void main(String[] args) {
         TreeNode t=new TreeNode(1);
         TreeNode r=new TreeNode(3);
         TreeNode l=new TreeNode(2);
         t.left=l;
         t.right=r;
         Solution solution=new Solution();
         solution.mirrorTree(t);
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值