二叉树算法的框架套路总结

news/2024/7/20 20:23:12 标签: 算法, 深度优先

二叉树算法的框架套路总结

总结

本文主要来源于Leetcode用户:https://leetcode.cn/u/labuladong/,感谢写了这么好的文章

作者:labuladong
链接:https://leetcode.cn/problems/same-tree/solutions/6558/xie-shu-suan-fa-de-tao-lu-kuang-jia-by-wei-lai-bu-/

 二叉树的设计总路线:明确一个节点要做什么事情,然后剩下的事情交给框架

void traverse(TreeNode root){
    // root需要做的事情


    // 遍历所要做的事情 全部在这里
    traverse(root.left);
    traverse(root.right);
}

将所有的节点值加一

void plusOne(TreeNode root){
    if(root == null){
        return ;// 首先写出递归结束条件
    }

    root.val += 1;
    plusOne(root.left);
    plueOne(root.right);
}

如何判断两个二叉树是否相等

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 比较两棵树是否相等
        // 深度优先遍历

        // 当两个节点都是null的时候 返回true  递归出口
        if(p == null && q == null){
            return true;
        }else if(p ==null || q == null){
            return false;
        }else if(p.val != q.val){
            return false;
        }


        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        
    }
}

判断二叉搜索树

  • 下面是错误的代码示例,因为判断一棵树是不是二叉搜索树,需要判断当前节点是不是大于全部的左子树节点以及小于全部的右子树节点,下面的代码只判断了左右节点
boolean isValidBST(TreeNode root) {
    if (root == null) return true;
    if (root.left != null && root.val <= root.left.val) return false;
    if (root.right != null && root.val >= root.right.val) return false;

    return isValidBST(root.left)
        && isValidBST(root.right);
}

正确的代码

boolean isValidBST(TreeNode root) {
    return isValidBST(root, null, null);
}

boolean isValidBST(TreeNode root, TreeNode min, TreeNode max) {
    if (root == null) return true;
    if (min != null && root.val <= min.val) return false;
    if (max != null && root.val >= max.val) return false;
    return isValidBST(root.left, min, root) 
        && isValidBST(root.right, root, max);
}



二叉搜索树插入一个节点

找到插入位置,然后进行插入操作

TreeNode insertIntoBST(TreeNode root,int val){
    // 找到空位置插入新节点
    if(root == null){
        return new TreeNode(val);
    }

    if(root.val < val){
        root.right = insertIntoBST(root.right,val);
    }

    if(root.val > val){
        root.left = insertIntoBST(root.left,val);
    }


    return root;
}

二叉搜索树删除一个节点

首先搭建一个框架

TreeNode deleteNode(TreeNode root,int key){
    if(root.val == key){
        // 删除操作
    }else if(root.val > key){
        root.left = deleteNode(root.left,key);
    }else if(root.val < key){
        root.right = deleteNode(root.right,key);
    }

    return root;
}

  • 如果是null 直接return null
if(root.left == null && root.right == null)
{
    return null;
}
  • 如果当前节点只有一个非空节点,让这个非空节点 代替他
if(root.left == null){
    return root.right;
}

if(root.right == null){
    return root.left;
}

  • 如果当前节点有两个子节点 找到右子树的最小节点代替自己
if(root.left != null && root.right != null){
    // 找到右子树的最小节点
    TreeNode minNode = getMin(root.right);

    // 将root更换
    root.val = minNode.val;

    // 删除minNode
    root.right = deleteNode(root.right,minNode.val);
}

  • 总结代码

TreeNode deleteNode(TreeNode root, int key) {
    if (root == null) return null;
    if (root.val == key) {
        // 这两个 if 把情况 1 和 2 都正确处理了
        if (root.left == null) return root.right;
        if (root.right == null) return root.left;
        // 处理情况 3
        TreeNode minNode = getMin(root.right);
        root.val = minNode.val;
        root.right = deleteNode(root.right, minNode.val);
    } else if (root.val > key) {
        root.left = deleteNode(root.left, key);
    } else if (root.val < key) {
        root.right = deleteNode(root.right, key);
    }
    return root;
}

TreeNode getMin(TreeNode node) {
    // BST 最左边的就是最小的
    while (node.left != null) node = node.left;
    return node;
} 



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

相关文章

数据可视化工具CEETRON Envision助力ESTECO客户实现CAE数据转化

​行业&#xff1a;制造业&#xff1b;工业设计&#xff1b;汽车&#xff1b;航天 挑战&#xff1a;工业客户需要有效的方法来解释 CAE 数据&#xff1b;ESTECO 寻求提供 CAE 可视化功能来帮助客户做出决策&#xff1b;许多可用的可视化工具无法提供对模型中数据的完全访问以进…

qt显示图片并转换成灰度图及伪彩图

写了个程序&#xff0c;可在途图片&#xff0c;并切换成灰度图及伪彩图显示&#xff0c;主要代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…

TiDB 源码编译之 TiFlash 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/5f3fe44d 导言 TiFlash 从去年四月一日开源至今已经过去将近一年半&#xff0c;这段时间里 TiFlash 从 v6.0.0-DMR 升级到了 v7.3.0-DMR &#xff0c;并增加了若干新特性&#xff0c;比如支持 …

c++:std::find_if使用,删除字符串空白字符串

方法 void trimLeft(std::string& str) {str.erase(str.begin(),std::find_if(str.begin(),str.end(),[](char ch)->bool{if(isspace(ch)){return false;}return true;})); }void trimRight(std::string& str) {str.erase(std::find_if(str.begin(),str.end(),[](c…

Vue-6.编译器webstorm

Vue专栏&#xff08;帮助你搭建一个优秀的Vue架子&#xff09; Vue-1.零基础学习Vue Vue-2.Nodejs的介绍和安装 Vue-3.Vue简介 Vue-4.编译器VsCode Vue-5.编译器Idea Vue-6.编译器webstorm Vue-7.命令创建Vue项目 Vue-8.Vue项目配置详解 Vue-9.集成&#xff08;.editorconfig、…

Nginx反向代理-负载均衡、webshell实践

目录 1.nginx反向代理-负载均衡 1&#xff09;搭建web项目 2&#xff09;修改 nginx.conf的配置 2.webshell 实践 1&#xff09;异或操作绕过 2&#xff09;取反绕过 3&#xff09;php语法绕过 1.nginx反向代理-负载均衡 1&#xff09;搭建web项目 首先通过SpringBoo…

基于51单片机直流电机PWM调速液晶1602显示设计

一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统&#xff0c;并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节&#xff0c;从而控制其输入信号波形等…

SpringBoot---内置Tomcat 配置和切换

&#x1f600;前言 本篇博文是关于内置Tomcat 配置和切换&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x…