1. 二叉树的深度

1. 题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

2. 求解思路

可以用后序遍历,从最后一层往上累加层数,最后加上根节点。

3. 代码

class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}public class TreeDepth {public static void main(String[] args) {// 新建一棵二叉搜索树TreeNode root=new TreeNode(10);TreeNode n1=new TreeNode(5);TreeNode n2=new TreeNode(12);TreeNode n3=new TreeNode(4);TreeNode n4=new TreeNode(7);TreeNode n5=new TreeNode(11);TreeNode n6=new TreeNode(16);TreeNode n7=new TreeNode(19);root.left=n1;root.right=n2;n1.left=n3;n1.right=n4;n2.left=n5;n2.right=n6;n6.right=n7;System.out.println("后序遍历:");postOrderTraverse(root);int temp=TreeDep(root);System.out.println("\n"+"深度:"+temp);}public static int TreeDep(TreeNode pRoot){if(pRoot == null){return 0;}int left = TreeDep(pRoot.left);int right = TreeDep(pRoot.right);return Math.max(left, right) + 1;}// 后序遍历public static void postOrderTraverse(TreeNode node) {  if (node == null)  return;  postOrderTraverse(node.left);  postOrderTraverse(node.right);  System.out.print(node.val + " ");  }}

运行:

后序遍历:
4 7 5 11 19 16 12 10
深度:4

2. 平衡二叉树

1. 题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

2. 解题思路

仍然可以用后序遍历树深度,同时每次遍历时都对比每一节点下的子节点分支的深度是不是符合平衡二叉树的要求。

3. 代码

class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}public class IsBalanced_Solution {public static void main(String[] args) {     // 新建一棵二叉搜索树TreeNode root=new TreeNode(10);TreeNode n1=new TreeNode(5);TreeNode n2=new TreeNode(12);TreeNode n3=new TreeNode(4);TreeNode n4=new TreeNode(7);TreeNode n5=new TreeNode(11);TreeNode n6=new TreeNode(16);TreeNode n7=new TreeNode(19);TreeNode n8=new TreeNode(20);root.left=n1;root.right=n2;n1.left=n3;n1.right=n4;n2.left=n5;n2.right=n6;n6.right=n7;n7.right=n8;System.out.println("后序遍历:");postOrderTraverse(root); isBalanced(root);System.out.println("\n"+"结果:"+isBalance);}static boolean isBalance=true;public static int isBalanced(TreeNode pRoot){if(pRoot == null){return 0;}int left = isBalanced(pRoot.left);int right = isBalanced(pRoot.right);if(Math.abs(left-right)>1){isBalance=false;}return Math.max(left, right) + 1;}// 后序遍历public static void postOrderTraverse(TreeNode node) {  if (node == null)  return;  postOrderTraverse(node.left);  postOrderTraverse(node.right);  System.out.print(node.val + " ");  }}

运行:

后序遍历:
4 7 5 11 20 19 16 12 10
结果:false

3. 二叉树的下一个结点

1. 题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

2. 解题思路

参考大神的思路如下:
首先知道中序遍历的规则是:左根右,然后作图

结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点…直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。

3. 代码

class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;TreeLinkNode(int val) {this.val = val;}
}public class GetNext {public static void main(String[] args) {// 新建一棵二叉搜索树TreeLinkNode root=new TreeLinkNode(10);TreeLinkNode n1=new TreeLinkNode(5);TreeLinkNode n2=new TreeLinkNode(12);TreeLinkNode n3=new TreeLinkNode(4);TreeLinkNode n4=new TreeLinkNode(7);TreeLinkNode n5=new TreeLinkNode(11);TreeLinkNode n6=new TreeLinkNode(16);TreeLinkNode n7=new TreeLinkNode(19);root.left=n1;n1.next=root;      root.right=n2;n2.next=root;n1.left=n3;n3.next=n1;n1.right=n4;n4.next=n1;n2.left=n5;n5.next=n2;n2.right=n6;n6.next=n2;n6.right=n7;n7.next=n6;System.out.println("中序遍历:");inOrderTraverse(root); System.out.print("\n"+"结果:");TreeLinkNode temp= getNxt(n5);System.out.print(n5.val+"->"+temp.val);}static TreeLinkNode getNxt(TreeLinkNode node){if(node==null) return null;if(node.right!=null){    //如果有右子树,则找右子树的最左节点node = node.right;while(node.left!=null) node = node.left;return node;}while(node.next!=null){ //没右子树,则找第一个当前节点是父节点左孩子的节点if(node.next.left==node) return node.next;node = node.next;}return null;   //退到了根节点仍没找到,则返回null}// 中序遍历public static void inOrderTraverse(TreeLinkNode node) {  if (node == null)  return;  inOrderTraverse(node.left);  System.out.print(node.val + " ");  inOrderTraverse(node.right);  }}

运行:

中序遍历:
4 5 7 10 11 12 16 19
结果:11->12

数据结构方面的小白,仅做学习。。。

java 二叉树的深度、平衡二叉树、二叉树的下一个结点相关推荐

  1. 《剑指offer》-- 二叉树的下一个结点、对称二叉树、按之字性顺序打印二叉树、把二叉树打印成多行

    一.二叉树的下一个结点: 1.题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2.解题思路: 分析二叉树 ...

  2. 【打卡第243道】【二叉树】【剑指Offer】:JZ8 二叉树的下一个结点

    1.题目描述 2.算法分析 既然是找中序遍历的某一个结点的下一个结点,其实思路已经很明确了.     1.将二叉树中序遍历,存储到集合中.前提,首先找到根节点.根节点可以根据指向父节点的next指针找 ...

  3. 《剑指offer》c++版本 8.二叉树的下一个结点

    如题: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点 的指针. 这道题目考察对二叉树中序遍历的理解,做题的时候,如果没 ...

  4. 剑指offer之二叉树的下一个结点

    1 问题 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针 2 分析 比如我现在的二叉树如下 42 61 3 5 7 ...

  5. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 8 二叉树中序遍历的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注 ...

  6. 剑指offer值二叉树的下一个结点

    题目简介 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 该题目主要考察对二叉树中序遍历规律的理解和分 ...

  7. 剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结 ...

  8. 剑指offer面试题[58]-二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode {int ...

  9. 剑指offer——面试题58:二叉树的下一个结点

    剑指offer--面试题58:二叉树的下一个结点 这个题要认真分析一下... Solution1: 自己想出来的破算法 /* struct TreeLinkNode {int val;struct T ...

最新文章

  1. 【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxxparam2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
  2. VS Code上也能玩转Jupyter Notebook,这是一份完整教程
  3. JS实现表格列宽拖动
  4. java ide编辑器 idea 配置 与 插件
  5. 自动化测试如何解决验证码的问题
  6. python小波变换尺度函数_Python图像处理(17):pyWavelet
  7. CSharpGL(49)试水OpenGL软实现
  8. 线程池与Callable更配哦
  9. QT5基础操作(一)
  10. Jmeter查看结果树
  11. HCIE-Security Day39:理论学习:隐私保护
  12. SVN系列二 SVN的安装配置(linux)
  13. rsync文件同步应用--客户端的配置
  14. 2019年“深圳杯”数学建模挑战赛B题解题思路(一)
  15. ALSA音频架构 -- aplay播放流程分析
  16. JAVA编写一个加密及解密程序
  17. 淘宝APP用户体系运营拆解​
  18. 电脑声控 电脑机器人功能
  19. 二进制漏洞挖掘之angr‘s Reaching Definition Analysis(二)
  20. C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

热门文章

  1. VTK:几何对象之ParametricObjects
  2. OpenCV使用霍夫变换进行寻线的实例(附完整代码)
  3. C语言求网格的最大不重复路径数的算法(附完整源码)
  4. C++实现深度优先搜索DFS(附完整源码)
  5. C++实现has-a关系的两种方法
  6. 文件传输服务器多目录,node ftp 模块 如何把本地多个文件夹或者文件上传到服务器...
  7. 「Apollo」Apollo感知汇总
  8. 做移动应用使用地图API时需要注意的问题
  9. 处理字符串_10_对字符串重新按字母排序重新组合
  10. Kettle使用_16 闭包Closure Generator树形数据