1.二叉树基本概念见上节:《Java 二叉树基础概念(递归&迭代)》

2.本次展示链式存储

以此图为例,完整代码如下:

//基础二叉树实现
//使用左右孩子表示法import java.util.*;
import java.util.Deque;public class myBinTree {private static class TreeNode{char val;TreeNode left;TreeNode right;public TreeNode(char val) {this.val = val;}}public static TreeNode build(){TreeNode nodeA=new TreeNode('A');TreeNode nodeB=new TreeNode('B');TreeNode nodeC=new TreeNode('C');TreeNode nodeD=new TreeNode('D');TreeNode nodeE=new TreeNode('E');TreeNode nodeF=new TreeNode('F');TreeNode nodeG=new TreeNode('G');TreeNode nodeH=new TreeNode('H');nodeA.left=nodeB;nodeA.right=nodeC;nodeB.left=nodeD;nodeB.right=nodeE;nodeE.right=nodeH;nodeC.left=nodeF;nodeC.right=nodeG;return nodeA;}//方法1(递归)//先序遍历: 根左右public static void preOrder(TreeNode root){if(root==null){return;}System.out.print(root.val+" ");preOrder(root.left);preOrder(root.right);}//方法1(递归)//中序遍历public static void inOrder(TreeNode root){if(root==null){return;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}//方法1(递归)//后序遍历public static void postOrder(TreeNode root){if(root==null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}//方法2(迭代)//先序遍历 (迭代)public static void preOrderNonRecursion(TreeNode root){if(root==null){return ;}Deque<TreeNode> stack=new LinkedList<>();stack.push(root);while (!stack.isEmpty()){TreeNode cur=stack.pop();System.out.print(cur.val+" ");if(cur.right!=null){stack.push(cur.right);}if(cur.left!=null){stack.push(cur.left);}}}//方法2(迭代)//中序遍历 (迭代)public static void inorderTraversalNonRecursion(TreeNode root) {if(root==null){return ;}Deque<TreeNode> stack=new LinkedList<>();// 当前走到的节点TreeNode cur=root;while (!stack.isEmpty() || cur!=null){// 不管三七二十一,先一路向左走到根儿~while (cur!=null){stack.push(cur);cur=cur.left;}// 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点cur=stack.pop();System.out.print(cur.val+" ");// 继续访问右子树cur=cur.right;}}//方法2(迭代)//后序遍历 (迭代)public static void postOrderNonRecursion(TreeNode root){if(root==null){return;}Deque<TreeNode> stack=new LinkedList<>();TreeNode cur=root;TreeNode prev=null;while (!stack.isEmpty() || cur!=null){while (cur!=null){stack.push(cur);cur=cur.left;}cur=stack.pop();if(cur.right==null || prev==cur.right){System.out.print(cur.val+" ");prev=cur;cur=null;}else {stack.push(cur);cur=cur.right;}}}//方法1(递归)//传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数//此时的访问就不再是输出节点值,而是计数器 + 1操作public static int getNodes(TreeNode root){if(root==null){return 0;}return 1+getNodes(root.left)+getNodes(root.right);}//方法2(迭代)//使用层序遍历来统计当前树中的节点个数public static int getNodesNoRecursion(TreeNode root){if(root==null){return 0;}int size=0;Deque<TreeNode> queue=new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode cur = queue.poll();size++;if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}return size;}//方法1(递归)//传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数public static int getLeafNodes(TreeNode root){if(root==null){return 0;}if(root.left==null && root.right==null){return 1;}return getLeafNodes(root.left)+getLeafNodes(root.right);}//方法2(迭代)//使用层序遍历来统计叶子结点的个数public static int getLeafNodesNoRecursion(TreeNode root){if(root==null){return 0;}int size=0;Deque<TreeNode> queue=new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){TreeNode cur=queue.poll();if(cur.left==null && cur.right==null){size++;}if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}}return size;}//层序遍历public static void levelOrder(TreeNode root) {if(root==null){return ;}// 借助队列来实现遍历过程Deque<TreeNode> queue =new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){int size=queue.size();for (int i = 0; i < size; i++) {TreeNode cur=queue.poll();System.out.print(cur.val+" ");if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}}}}//传入一个以root为根节点的二叉树,就能求出该树的高度public static int height(TreeNode root){if(root==null){return 0;}return 1+ Math.max(height(root.left),height(root.right));}//求出以root为根节点的二叉树第k层的节点个数public static int getKLevelNodes(TreeNode root,int k){if(root==null || k<=0){return 0;}if(k==1){return 1;}return getKLevelNodes(root.left,k-1)+getKLevelNodes(root.right,k-1);}//判断当前以root为根节点的二叉树中是否包含指定元素val,//若存在返回true,不存在返回falsepublic static boolean contains(TreeNode root,char value){if(root==null){return false;}if(root.val==value){return true;}return contains(root.left,value) || contains(root.right,value);}public static void main(String[] args) {TreeNode root=build();System.out.println("方法1(递归):前序遍历的结果为:");preOrder(root);System.out.println();System.out.println("方法2(迭代):前序遍历的结果为:");preOrderNonRecursion(root);System.out.println();System.out.println("方法1(递归):中序遍历的结果为:");inOrder(root);System.out.println();System.out.println("方法2(迭代):中序遍历的结果为:");inorderTraversalNonRecursion(root);System.out.println();System.out.println("方法1(递归):后序遍历的结果为:");postOrder(root);System.out.println();System.out.println("方法2(迭代):后序遍历的结果为:");postOrderNonRecursion(root);System.out.println();System.out.println();System.out.println("层序遍历的结果为:");levelOrder(root);System.out.println();System.out.println();System.out.println("方法1(递归):当前二叉树一共有:"+getNodes(root)+"个节点数");System.out.println("方法2(迭代):当前二叉树一共有:"+getNodesNoRecursion(root)+"个节点数");System.out.println("方法1(递归):当前二叉树一共有:"+getLeafNodes(root)+"个叶子节点数");System.out.println("方法2(迭代):当前二叉树一共有:"+getLeafNodesNoRecursion(root)+"个叶子节点数");System.out.println(contains(root,'E'));System.out.println(contains(root,'P'));System.out.println("当前二叉树的高度为:"+height(root));System.out.println("当前二叉树第3层的节点个数为:"+getKLevelNodes(root,3));}
}

如上main引用结果如下:

Java 二叉树完整代码(递归迭代)相关推荐

  1. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  2. java 数据库工资管理系统设计_数据库课程设计—企业工资管理系统(java版完整代码)...

    数据库课程设计-企业工资管理系统(java版完整代码) 数 据 库 课 程 设 计 报 告2016年 5月 20日 目 录企业工资管理系统姓 名 王 素 文班 级 软 133学 号 139074224 ...

  3. C++ class实现二叉树(完整代码,附非递归遍历)

    代码如下: #include <iostream> #include <stack> #include <queue> using namespace std; t ...

  4. 非递归中序,后序,先序遍历二叉树完整代码(用链式栈实现)

    后序遍历: #include <iostream> #include <bits/stdc++.h> using namespace std; typedef struct B ...

  5. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

    [问题描述][简单] [解答思路] 1. 递归 终止条件/基本情况 root ==null 递推关系 max(l,r)+1 时间复杂度:O(N) 空间复杂度:O(height) class Solut ...

  6. 新手java五子棋完整代码判断落子落在线上_Java初学者,编写小游戏五子棋的问题?...

    首先你需要掌握GUI编程,事件处理,已经监听器,你就掌握Swing的知识就好了Swing框架,JFrame,JPanel,鼠标.键盘监听事件 Java基础,面向对象,异常处理,集合,IO流 网络编程, ...

  7. 新手java五子棋完整代码判断落子落在线上_JAVA五子棋开发

    让我们来思考一个问题:如何用Java来开发出一个五子棋项目?首先,没有界面其它的也就无从谈起,这里需要用到Java的SWING与AWT组件:有了五子棋界面,我们要能在界面上画出黑白棋子:最后,能够对输 ...

  8. c语言实现层次遍历二叉树完整代码

    //混用了一下c和c++(仅输入输出混用了一下,其他没有)#include<stdio.h> #include<stdlib.h> #include<iostream&g ...

  9. Java 二叉树基础概念(递归迭代)

    目录 1. 树型结构 1.1概念 1.2 概念(重要) 2. 二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 2.4 二叉树的性质 a.满二叉树 b.完全二叉树 2. ...

  10. 二叉树中序遍历(递归+迭代)——java

    目录 一.题目 二.中序遍历讲解 三.中序遍历递归法实现 1.递归思路 2.代码实现 四.中序遍历迭代法实现 1.迭代思路 2.代码实现 五.欢迎访问我的java二叉树专栏 一.题目 1.题目链接:二 ...

最新文章

  1. ASP.NET MVC3 在WebGrid中用CheckBox选中行
  2. PL/SQL Developer 连接远程oracle的方法
  3. Python属性和内建属性
  4. FFMPEG avformat_open_input
  5. django-2-目录结构
  6. skywalking 源码解析——多线程变量传递 EnhancedInstance
  7. 云计算的发展及应用--演讲用PPT
  8. 我们为什么都应该坚持写博客,意义何在?
  9. poj[2230]Watchcow 深搜 欧拉回路
  10. 大数据技术_ 基础理论 之 数据采集与预处理
  11. 王垠 java,王垠,40行代码,JAVA吧的大神怎么评论?
  12. .chm格式的电子书打开是空白的解决办法
  13. ural 1104. Don’t Ask Woman about Her Age
  14. 借助Writage,将 Word 转换为 Markdown发表csdn博客
  15. 怎么解决服务器延迟问题
  16. EverNote开源协议-Android
  17. 蓝桥杯基础练习一闰年判断
  18. MAC Nginx配置: open() “xxx/logs/error.log“ failed (2: No such file or direc
  19. webview加载html图片不显示图片,WebView加载网页不显示图片解决办法
  20. 【windows10】将路由器设置为交换机

热门文章

  1. 学习日记——W25Q64 FLASH—QSPI
  2. 免费下载IOS/MAc付费软件
  3. 基于单片机的八路抢答器系统设计(#0402)
  4. 如何学习Java软件开发
  5. WOWZA的安装及(VOD+LIVE)简单配置和VLC RTP推流
  6. 别再白瞎去花钱购买高精度卫星地图,一文教你解决精度与下载问题
  7. 测试固态硬盘写入数据软件,SSD测试软件简要说明
  8. 一套价值800元的爱代挂源码完整版
  9. 互联网黑产剖析——虚假号码
  10. gb2312tobig5 delphi简繁转换