ACM算法笔记(五)二叉树的检查和变换

news/2024/7/7 8:39:16

一、对称二叉树

        给定一颗二叉树,检查他是否对称

        思路:使用递归处理(递归的比较左子树的左孩子右子树的右孩子

public bool isSymmetric(TreeNHode root)
{
    if(root == nuill)
        return ture;
    return deepCheck(root.left,root.right);//递归比较
}

bool deepCheck(TreeNode left,TreenNode right)
{
    if(left == null && right == null)
        return true;
    if(left == null || right == null)
        return false;
    if(left.val != right.val)
        return false;

    //进行递归检查
    return deepCheck(left.left,right.right) && deepCheck(left.right,right.left);
}

        思路2:   ①将根节点的左孩子和右孩子全部入队,然后出队

                        ②出队后将左孩子的左子树和右孩子的右子树/左孩子的右子树和右孩子的左子树放入队列

                        ③再次出队,同时按照方法②的顺序将下一层入队

public bool isSymmetric(TreeNode root)
{
    Queue<TreeNode> q = new LinkedList<TreeNode>();
    TreeNode u = root.left;
    TreeNode v = root.right;
    if(root == null || u == null || v == null)
        return false;
    q.offer(u);
    q.offer(v);
    
    while(!q.isEmpty())
    {
        u = q.poll();
        v = q.poll();
        if(u == null && v == null)
            contiune;
        if((u == null || v ==null) || (u.val != v.val))

            return false;
        
        q.offer(u.left);
        q.offer(v.right);

        q.offer(u.right);
        q.offer(v.left);
    }
    return true;
}

二、二叉树的最大深度

        思路:遍历根结点的左孩子和右孩子,取出最大高度+1即可

public int MaxDepth(TreeNode root)
{
    if(root == null)
        return 0;
    else
        return Math.max( maxDepth(root.left) , maxDepth(root.right) )+1
}

        思路2:使用队列实现(分层推入队列,高度+1)

public int maxDepth(TreeNode root)
{
    if(root == null)
        return 0;
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.offer(root);
    int depth = 0;
    while(!queue.isEmpty())
    {
        int size = queue.size();//记录本层级的节点是否完成处理
        while(size > 0)
        {
            TreeNode node = queue.poll();
            if(node.left != null)
                queue.offer(node.left);
            if(node.right != null)
                queue.offer(node.right);
            size--;
        }
        depth++;
    }
    return depth;
}

三、平衡二叉树

        判断一颗二叉树是否是高度平衡的二叉树(每个结点的左右子树的高度差值不超过1)

        思路:从定义来看,一颗二叉树是平衡二叉树的条件是其子树都是平衡二叉树。可以使用递归的方式来判定其是否平衡。从最底层的子树开始判断,逐层向上直到根为止

public bool isBalanced(TreeNode root)
{
    if(root == null)
        return true;
    return helper(root) != -1;
}

int helper(TreeNode root)
{
    if(root == null)
        return 0;
    int left = helper(root.left);
    int right = helper(root.right);

    if(left == -1 || right == -1 || Math.abs(left - right) >-1)
        return -1;
    return Math.max(left,right)+1;
}

 四、反转二叉树

         思路:使用递归将左右子树进行调转

public TreeNode invertTree(TreeNoderoot)
{
    if(root == null)
        return null;
    invertTree(root.left);
    invertTree(root.right);

    TreeNode temp = root.left;
    root.left = root.right;
    root.right = temp;
    return root;
}


http://www.niftyadmin.cn/n/4217498.html

相关文章

对Vue的生命周期的理解

因为是第一天学习vue&#xff0c;可能有理解不全面或者错误的地方&#xff0c;如果有误导&#xff0c;非常抱歉。 Vue的生命周期1. 生命周期是什么2. 生命周期过程图3. Vue的生命周期钩子函数4. 测试钩子函数1. 生命周期是什么 Vue的每个组件都是独立的&#xff0c;从一个组件…

Vue学习Day2 v-bind动态绑定属性、计算属性、v-on事件监听、v-if、登陆切换小案例、v-show

想利用暑假时间好好学习一下vue&#xff0c;会记录每一天的学习内容。 今天是学习vue的第2天&#xff01; 起起伏伏乃人生常态&#xff0c;继续加油&#xff5e; 学习内容1. v-bind 使用简单使用v-bindv-bind语法糖v-bind动态绑定class对象语法v-bind动态绑定class数组语法v-bi…

Vue学习Day3 v-for遍历、组件的key属性、列表点击变色案例、书籍购物车案例

想利用暑假时间好好学习一下vue&#xff0c;会记录每一天的学习内容。 今天是学习vue的第3天&#xff01; 起起伏伏乃人生常态&#xff0c;继续加油&#xff5e; 学习内容1. v-for使用v-for遍历数组v-for遍历对象组件的key属性2.检测数组更新3.列表项点击变色简单案例4. 书籍购…

Vue学习Day4 v-model表单双向绑定、注册组件、组件模版分离、组件中的数据存放、组件中data为什么是个函数

想利用暑假时间好好学习一下vue&#xff0c;会记录每一天的学习内容。 今天是学习vue的第4天&#xff01; 起起伏伏乃人生常态&#xff0c;继续加油&#xff5e; 学习内容1. 表单绑定v-modelv-model原理v-model&#xff1a;radiov-model&#xff1a;checkboxv-model&#xff1a…

Myeclipse打开就出错Could not create the Java virtual machine

Myeclipse打开就出错Could not create the Java virtual machine 描述&#xff1a; JVM_terminted_Exit_code1图片&#xff1a;描述&#xff1a; Could_not create_the_Java_virtual_machine图片&#xff1a;myeclipse一启动就自动关闭&#xff0c;报错"Could not creat…

JavaScript高级程序设计 学习笔记3 - 语言基础

内容均摘自JavaScript高级程序设计第四版&#xff0c;仅用于记录学习过程。 虽然这一章都很基础&#xff0c;但是还是有很多小细节需要注意的&#xff01;好好看看吧&#xff5e;进一步细分了书里的目录&#xff0c;这样查询也更方便啦 第三章 语言基础一.语法3.1 语法3.1.1 区…

Myeclipse7.0安装时出现“灾难性故障”

Myeclipse7.0在安装过程中会报 “灾难性故障”&#xff0c;总结了一下&#xff0c;可能原因有一下几个方面 1. jdk版本和Myeclipse不兼容 解决方案&#xff1a;重新安装jdk新版本 2.安装路径的问题 解决方案&#xff1a;安装Myeclipse时&#xff0c;不修改其默认的安装路径…

mysql 的基本数据类型

数值类型 MySQL 的数值数据类型可以大致划分为两个类别&#xff0c;一个是整数&#xff0c;另一个是浮点数或小数。MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。 表列出了各种数值类型以及它们的允许范围和占用的内存空间。 类型大小范围&#xff08;有符号&…