Java实现二叉树地遍历、求深度和叶子结点的个数

一、分析

  二叉树是n个结点所构成的集合,它或为空树,或为非空树。对于非空树,它有且仅有一个根结点,且除根结点以外的其余结点分为两个互不相交的子集,分别称为左子树和右子树,它们本身又都是二叉树。

  显而易见,二叉树具有递归的性质,因此表示二叉树的结点至少要包含3个域:数据域、左指针、右指针。在Java中,我们可以将二叉树的结点视为一个类,其中含有左子树地址、右子树地址和数据三个属性,每个结点即使类的实例化对象。因为二叉树的递归性质,所以我们可以通过递归来实现二叉树地求深度、求叶子结点的个数、先序、中序、后序遍历,而层序遍历则可以通过队列来实现。

二、实现

1、定义结点类

 1 class InitBiTree{
 2
 3     private String data = null;
 4
 5     private InitBiTree lchild = null;
 6
 7     private InitBiTree rchild = null;
 8
 9     public String getData() {
10         return data;
11     }
12
13     public void setData(String data) {
14         this.data = data;
15     }
16
17     public InitBiTree getLchild() {
18         return lchild;
19     }
20
21     public void setLchild(InitBiTree lchild) {
22         this.lchild = lchild;
23     }
24
25     public InitBiTree getRchild() {
26         return rchild;
27     }
28
29     public void setRchild(InitBiTree rchild) {
30         this.rchild = rchild;
31     }
32 }

2、定义方法类

 1 class Tools{
 2     public static InitBiTree createBiTree() {                  //先序遍历创建二叉树
 3         System.out.print("请按先序次序依次输入二叉树的值,#号表示建立空树:");
 4         Scanner sc = new Scanner(System.in);
 5         String input = null;
 6         input = sc.next();
 7         if(input.equals("#")) {
 8             return null;
 9         }else {
10             InitBiTree initBiTree = new InitBiTree();
11             initBiTree.setData(input);
12             initBiTree.setLchild(Tools.createBiTree());
13             initBiTree.setRchild(Tools.createBiTree());
14             return initBiTree;
15         }
16     }
17
18     public static void preOrderTraverse(InitBiTree initBiTree) {      //先序遍历
19         if(initBiTree != null) {
20             System.out.print(initBiTree.getData());
21             Tools.preOrderTraverse(initBiTree.getLchild());
22             Tools.preOrderTraverse(initBiTree.getRchild());
23         }
24     }
25
26     public static void inOrderTraverse(InitBiTree initBiTree) {       //中序遍历
27         if(initBiTree != null) {
28             Tools.inOrderTraverse(initBiTree.getLchild());
29             System.out.print(initBiTree.getData());
30             Tools.inOrderTraverse(initBiTree.getRchild());
31         }
32     }
33
34     public static void postOrderTraverse(InitBiTree initBiTree) {      //后序遍历
35         if(initBiTree != null) {
36             Tools.postOrderTraverse(initBiTree.getLchild());
37             Tools.postOrderTraverse(initBiTree.getRchild());
38             System.out.print(initBiTree.getData());
39         }
40     }
41
42     public static void levelOrderTraverse(InitBiTree initBiTree) {     //层序遍历
43         if(initBiTree != null) {
44             LinkedList<InitBiTree> linkedList = new LinkedList<InitBiTree>();
45             linkedList.offer(initBiTree);
46             while(!linkedList.isEmpty()) {
47                 initBiTree = linkedList.poll();
48                 if(initBiTree.getLchild() != null) {
49                     linkedList.offer(initBiTree.getLchild());
50                 }
51                 if(initBiTree.getRchild() != null) {
52                     linkedList.offer(initBiTree.getRchild());
53                 }
54                 System.out.print(initBiTree.getData());
55             }
56         }
57     }
58
59     public static int biTreeDepth(InitBiTree initBiTree) {          //求二叉树深度
60         if(initBiTree != null) {
61             int l = Tools.biTreeDepth(initBiTree.getLchild());
62                     int r = Tools.biTreeDepth(initBiTree.getRchild());
63                     if(l > r) {
64                         return l + 1;
65                     }else {
66                             return r + 1;
67                     }
68         }else {
69             return 0;
70         }
71     }
72
73     public static int biTreeNodeCount(InitBiTree initBiTree) {       //求叶节点个数
74         if(initBiTree != null) {
75             int l = Tools.biTreeNodeCount(initBiTree.getLchild());
76             int r = Tools.biTreeNodeCount(initBiTree.getRchild());
77             if(l == 0 && r == 0) {
78                 return 1;
79             }else {
80                 return l + r;
81             }
82         }else {
83             return 0;
84         }
85     }
86 }

3、主函数调用

 1 package word7;
 2
 3 import java.util.LinkedList;
 4 import java.util.Scanner;
 5
 6 public class Main {
 7
 8     public static void main(String[] args) {
 9         InitBiTree initBiTree = Tools.createBiTree();
10         System.out.println("——————先序遍历——————");
11         Tools.preOrderTraverse(initBiTree);
12         System.out.println();
13         System.out.println("——————中序遍历——————");
14         Tools.inOrderTraverse(initBiTree);
15         System.out.println();
16         System.out.println("——————后序遍历——————");
17         Tools.postOrderTraverse(initBiTree);
18         System.out.println();
19         System.out.println("——————层序遍历——————");
20         Tools.levelOrderTraverse(initBiTree);
21         System.out.println();
22         System.out.println("——————二叉树深度——————");
23         System.out.println(Tools.biTreeDepth(initBiTree));
24         System.out.println("——————叶子结点个数——————");
25         System.out.println(Tools.biTreeNodeCount(initBiTree));
26     }
27
28 }

三、运行截图

原文地址:https://www.cnblogs.com/ysyasd/p/10810479.html

时间: 2024-10-20 05:18:03

Java实现二叉树地遍历、求深度和叶子结点的个数的相关文章

java实现二叉树及遍历、删除

java实现二叉树及遍历.删除 个人网站:多猫影视[可以看各大网站的VIP视频]www.duomao.xyz 二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——如图(a): (2)只有一个根结点的二叉树——如图(b): (3)只有左子树——如图(c): (4)只有右子树——如图(d): (5)完全二叉树——如图(e). 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形.[1] 类型 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它

java实现二叉树层次遍历

public class BSTNode<T extends Comparable<T>> { T key; // 关键字(键值) BSTNode<T> left; // 左孩子 BSTNode<T> right; // 右孩子 BSTNode<T> parent; // 父结点 public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T&g

用java实现二叉树的遍历算法

用java实现二叉树的遍历算法用java实现二叉树的遍历算法,编写二叉树类BinaryTree代码如下:package package2; public class BinaryTree { int data; //根节点数据BinaryTree left; //左子树BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类{this.data = data;left = null;right = null;} public vo

二叉树的遍历,深度求解以及竖向打印详析

二叉树是每个节点最多有两个子树的有序树.二叉树常被用于实现二叉查找树和二叉堆.值得注意的是,二叉树不是树的特殊情形.在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于2.有根二叉树还要满足根结点的度不大于2.有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点.然而,没有足够的信息来区分左结点和右结点.二叉树详细请看本文:二叉树 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问 题. 遍历是二叉树上

java生成二叉树和遍历

在java中实现二叉树和链表的方法都是在类中定义该类的对象引用 比如 class Tree { int data; Tree left; Tree right; } 这样的话当我们new一个Tree对象的时候,该对象就拥有了left和right两个对象,这样就起到了连接的 作用,在链表中就是连接了下一个,在树中就相当于边,这样就起到一个接一个的效果.总之,就是吧对象连接起来了. 下面是完整代码 package code; public class TwoTree { public static

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

二叉树的三种遍历的应用(表达式,求深度,叶子数,结点数,二叉树的建立,复制)

表达式的表示 如图所示的二叉树表达式: a+b*(c-d)-e/f 若先序遍历此二叉树,按访问结点的先后次序将结点排列起来,其先序序列为: (波兰式,前缀表达式)  -+a*b-cd/ef 按中序遍历,其中序序列为:a+b*c-d-e/f (中缀表达式) 按后序遍历,其后序序列为:abcd-*+ef/- (逆波兰式,后缀表达式) 注:人喜欢中缀形式的算术表达式,对于计算机,使用后缀易于求值 查询二叉树中某个结点 使用先序遍历算法进行查询遍历 // 若二叉树中存在和 x 相同的元素,则 p 指向该

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int