//树的前序中序后续递归非递归+层序+按照每层节点输出
package baselearning.tree;import java.util.*;class TreeNode {String val;TreeNode left;TreeNode right;public TreeNode(String val) {this.val = val;}
}public class Orders {//递归前序public static TreeNode preOrder(TreeNode tree) {//中止条件if (tree == null)return null;TreeNode root = tree;System.out.printf(root.val + " ");//不用判断直接递归调用preOrder(tree.left);preOrder(tree.right);return root;}//前序非递归 用栈辅助操作public static void preOrder2(TreeNode root) {//判空if (root == null)return;Stack<TreeNode> stack = new Stack<>();//先把头结点放进栈里面stack.push(root);while (!stack.isEmpty()) {TreeNode treeNode = stack.pop();System.out.println(treeNode.val);if (treeNode.right != null)stack.push(treeNode.right);if (treeNode.left != null)stack.push(treeNode.left);}}//中序public static TreeNode midOrder(TreeNode tree) {if (tree == null)return null;midOrder(tree.left);TreeNode root = tree;System.out.printf(root.val + " ");//不用判断直接递归调用midOrder(tree.right);return root;}//中序非递归public static void midOrder2(TreeNode root) {//判空if (root == null)return;Stack<TreeNode> stack = new Stack<>();//设置一个指针指向根节点TreeNode cur = root;stack.push(root);while (!stack.isEmpty() || cur != null) {while (cur != null) {stack.push(cur);//不用判断 直接把指针往左移动cur = cur.left;}//输出 记录当前输出的节点 看他的右孩子有没有TreeNode treeNode = stack.pop();System.out.print(treeNode.val + " ");//先输出值再看右边的孩子//移动指针 然后不为空就会方进球if (treeNode.right != null)cur = treeNode.right;}}//后续public static TreeNode postOrder(TreeNode tree) {if (tree == null)return null;TreeNode root = tree;postOrder(tree.left);postOrder(tree.right);System.out.printf(root.val + " ");//不用判断直接递归调用return root;}//后续 左右根 先序 根左右 先放右再放左//在先序的基础上更改 先放左再放右 根右左 再逆序 左右根//用两个栈public static void postOrder2(TreeNode root) {//先序后再改进if (root == null)return;Stack<TreeNode> stack = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();//先把根节点放入栈中stack.push(root);while (!stack.isEmpty()) {//先放右后放左边TreeNode treeNode = stack.pop();//用stack2存储序列·stack2.push(treeNode);if (treeNode.left != null) {stack.push(treeNode.left);}if (treeNode.right != null) {stack.push(treeNode.right);}}while (!stack2.isEmpty())System.out.print(stack2.pop().val + " ");}/*** 层序遍历** @param root*/public static void bfs(TreeNode root) {//判空if (root == null)return;//构建队列先进先出Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode tree = queue.poll();System.out.print(tree.val + " ");if (tree.left != null)queue.add(tree.left);if (tree.right != null)queue.add(tree.right);}}//层序遍历 按照每层的节点数量//按照每层节点数返回输出/*** 构建存储字符串链表的链表 输出形式[['a','b'],['c']]* 用size记录每层的数量** @param root* @return*/public static List<List<String>> bfs2(TreeNode root) {//判空if (root == null)return null;//构建结果列表List<List<String>> res = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {//记录当前队列的长度 每次出队之前记录int size = queue.size();System.out.println(size);List<String> temp = new ArrayList<>();while (size-- > 0) {TreeNode tree = queue.poll();temp.add(tree.val);if (tree.left != null)queue.add(tree.left);if (tree.right != null)queue.add(tree.right);}//每遍历一层就把一层的东西放进去res.add(temp);}return res;}public static void main(String[] args) {//构建树TreeNode treeA = new TreeNode("A");TreeNode treeB = new TreeNode("B");TreeNode treeC = new TreeNode("C");TreeNode treeD = new TreeNode("D");TreeNode treeE = new TreeNode("E");TreeNode treeF = new TreeNode("F");TreeNode treeG = new TreeNode("G");treeA.left = treeB;treeA.right = treeC;treeB.left = treeD;treeB.right = treeE;treeC.right = treeF;treeE.left = treeG;
//        preOrder(treeA);
//        postOrder(treeA);
//        System.out.println();
//        postOrder2(treeA);
//        System.out.println();bfs(treeA);System.out.println();System.out.println(bfs2(treeA));}
}

参考视频:

java高频算法题(二叉树遍历)_哔哩哔哩_bilibili

//二叉排序树的增加删除查找 删除真的很难要多看看
package baselearning.tree;/*
二叉搜索树的构建增删改查*/
//存储的数据元素是必须可以比较的 并且树可以迭代
class TreeNode1 {public int val;public TreeNode1 left;public TreeNode1 right;public TreeNode1(int val) {this.val = val;}
}public class BinarySearchTree {//构建一个根节点public TreeNode1 root;//添加方法public boolean insert(int val) {//判断是否为空 如果是空的话直接创建if (root == null) {root = new TreeNode1(val);return true;}//不为空的情况 preCur指向上一个节点TreeNode1 preCur = root;//cur指向当前节点TreeNode1 cur = null;//当cur超出叶子节点后,此时的 preCur指向要插入的叶子节点//二叉搜索树 左边《根《右边while (preCur != null) {//上一个节点小于要插入的数值if (preCur.val < val) {//保存上一个节点cur = preCur;//往右走preCur = preCur.right;} else if (preCur.val > val) {cur = preCur;//往左走preCur = preCur.left;} else {return false;}}//在原有树上比较晚了找到了位置 curPre成为了叶子结点if (cur.val < val) {cur.right = new TreeNode1(val);} else {cur.left = new TreeNode1(val);}return true;}//查找public boolean search(int val) {if (root == null) return false;TreeNode1 cur = root;while (cur != null) {if (cur.val < val)cur = cur.right;else if (cur.val > val)cur = cur.left;else return true;}return false;}//替换元素 删除的时候是要更改二叉树的数值的public boolean remove(int val) {if (root == null)return false;//循环找到要删除的元素TreeNode1 cur = root;TreeNode1 curpre = null;while (cur != null) {if (cur.val < val) {//左侧查找 记录当前的指针curpre = cur;cur = cur.left;} else if (cur.val > val) {//左侧查找 记录当前的指针curpre = cur;cur = cur.right;} else {//找到该节点删除节点removeNode(curpre, cur);return true;}}return false;}/*** @param parent curpre* @param tmp    cur*/private void removeNode(TreeNode1 parent, TreeNode1 tmp) {//分情况// a.1被删节点的左子树为nullif (tmp.left == null) {//a.1.1删除节点为根节点if (tmp == root) {parent = tmp.right;//a.1.2删除节点为根节点的右子树} else if (parent.right == tmp) {parent.right = tmp.right;//a.1.3删除节点为根节点的左子树} else {parent.left = tmp.right;}} else if (tmp.right == null) {//a.2.1删除节点为根节点if (tmp == root) {parent = tmp.left;//a.1.2删除节点为根节点的右子树} else if (parent.right == tmp) {parent.right = tmp.left;//a.1.3删除节点为根节点的左子树} else {parent.left = tmp.left;}//a.3删除节点的左右子树都不为null,我使用被删节点的右子树中找最小值} else {TreeNode1 curParent = tmp;//记录cur的前一个TreeNode1 cur = tmp.right;//右子树找Min//被删节点的右子树下的左子树如果存在,那最小值肯定就在左子树while (cur.left != null) {curParent = cur;cur = cur.left;}//此时有两种情况,一种压根没进while(无左子树),一种是进了(有左子树)//找到最小值并覆盖被删节点的值tmp.val = cur.val;//连接跳过最小值if (cur == curParent.left) {//有左子树curParent.left = cur.right;//此时cur是最小,连接cur的右子树} else {//无左子树curParent.right = cur.right;}}}//先序遍历public void preOrder(TreeNode1 root) {if (root == null) return;System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);}//中序遍历public void inOrder(TreeNode1 root) {if (root == null)return;inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}public static void main(String[] args) {BinarySearchTree testBinarySearchTree = new BinarySearchTree();testBinarySearchTree.insert(13);testBinarySearchTree.insert(4);testBinarySearchTree.insert(17);testBinarySearchTree.insert(5);testBinarySearchTree.inOrder(testBinarySearchTree.root);System.out.println();testBinarySearchTree.preOrder(testBinarySearchTree.root);System.out.println();System.out.println(testBinarySearchTree.search(1));System.out.println(testBinarySearchTree.search(4));System.out.println(testBinarySearchTree.search(14));System.out.println(testBinarySearchTree.search(17));System.out.println("==========================================");testBinarySearchTree.remove(13);testBinarySearchTree.inOrder(testBinarySearchTree.root);System.out.println();}
}

二叉树的一天+吵架和好的一天

参考链接 写的很好

java实现并图解二叉搜索树的添加、查找以及删除方法(保姆级教程)_憾°的博客-CSDN博客_二叉搜索树删除java

DayN剑指offer树基础相关推荐

  1. 剑指 offer 树的子结构

    子树和子结构的区别 这棵大树的子树有: 4 和 5 对应的两棵子树 3 本身自己完整的一棵树 而里面的小框圈出来的不是 3 这棵大树的子树! 还是上面那张图,子结构就是不用那么严格,图中的小框就是整棵 ...

  2. 剑指offer 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解决方案: /** public class TreeNode {int val = 0;Tree ...

  3. 剑指offer——树的子结构

    Q:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) A:要查找树A中是否存在和树B结构一样的子树.我们可以分为两步: 第一步在树A中找到和B的根节点一样的值 ...

  4. 《剑指offer》——基础数据结构:从简单知识构建细致扎实的思考和实现能力...

    待补充-- 转载于:https://www.cnblogs.com/qinziang/p/9097047.html

  5. 剑指OFFER思路总结与代码分享——树篇(Java实现)

    剑指OFFER树相关 55-1 二叉树的深度 27 二叉树的镜像 54 二叉搜索树的第K大节点 32-II 从上到下打印二叉树 07 重建二叉树 68-I 二叉搜索树的最近公共祖先 68-II 二叉树 ...

  6. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  7. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

  8. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...

  9. 【LeetCode】剑指 Offer 26. 树的子结构

    [LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...

最新文章

  1. 锁定计算机的mad命令,本次操作由于这台计算机的限制而被取消
  2. 武汉大学计算机学院2019考研复试,2019年武汉大学硕士研究生复试及录取名单汇总...
  3. js-js的全局变量和局部变量
  4. 95-290-055-源码-内存管理-HybridMemorySegment
  5. php修改mongo,php操作MongoDB基础教程(连接、新增、修改、删除、查询)
  6. SDN/NFV若干问题
  7. 表情库 android,Emojicon
  8. 《Web漏洞防护》读书笔记——第12章,CSRF跨站点请求伪造防护
  9. vs2019番茄助手 附安装教程
  10. qq代理服务器传输文件失败,qq接收文件时显示传输文件失败?
  11. 一个数据存取类的代码,请高手帮忙分析和指定是否有误!
  12. B2B2C、C2F、S2B2b2C、O2O、S2B2C和各种的模式缩写解释说明
  13. mysql存储表情字符_MySQL 存储表情字符
  14. 文件夹名称有英语如何翻译为中文重命名
  15. 光流传感器 定位精度_光流定位原理是什么??
  16. 新西兰.net和java_使用Linux容器分析气候变化和土壤对新西兰农作物的影响
  17. 【身体这些部位不舒服的时候,你知道意味着什么吗?】
  18. 对Slim 框架进行总结 一
  19. 用什么软件能测试cpu好坏,如何检测cpu是否损坏
  20. RAID 容量计算器

热门文章

  1. Leetcode Solutions - Part 1
  2. Android 亮屏慢问题处理
  3. window程序设计(创建、选择和删除画笔)
  4. STARTING POINT TIER 2 Oopsie
  5. python高级—— 从趟过的坑中聊聊爬虫、反爬、反反爬,附送一套高级爬虫试题...
  6. linux限制iphone性能,iPhone 11系列内置系统会限制手机性能吗?
  7. 面相大师App技术支持
  8. 百收网谈创业:做生意最赚钱的行业已经来了 但是很多人看不懂
  9. 自媒体创业必备的6个在线神器|免费效率工具
  10. css当鼠标放到图片加边框的效果