- 浏览: 18994 次
- 性别:
- 来自: 湖南常德
最新评论
一、数的相关
节点: 节点是树的基本组成单位,它由数据域和指向其他节点的指针
度: 节点拥有子节点的个数称为该节点的度。
叶子节点:叶子节点是树的终端节点,其度为0。
高度: 树种节点的最大层次称为树的高对(或者叫深度)。
根节点:
二叉树: 二叉树是树的一种,其特点是每个节点至多只有两颗子树(即
于2的节点),并且二叉树的子树有左右之分,其次序不能随意颠倒。
二叉树的遍历:二叉树有四种遍历次序,先序遍历,终须遍历,后序遍历
例如,一下面的树为例
先序遍历:
步骤:
若二叉树不为空,则
访问根节点;
先序遍历左子树;
先序遍历右子树;
则下面的树的先序遍历顺序为:ABDECFG
中序遍历:
步骤:
若二叉树不为空,则
中序遍历左子树;
访问根节点;
中序遍历右子树;
则下面的树的中序遍历为:DBEAFCG
后序遍历:
步骤:
若二叉树不为空,则
后序遍历左子树;
后序遍历右子树;
访问根节点;
则下面的树的后序遍历为:DEBFGCA
A
/ \
B C
/\ /\
D E F G
例如,在上面的树,A是根节点(root),D,E,F,G则是叶子节点B,C是A的子节点,是D,E,F,G
的父节点,D,E,F,G则是兄弟节点。我们在定义树的节点之间的关系时与链表相似,同样是用类封装。
public class BinaryTree { private BinaryTree root;// 二叉树的根 private BinaryTree lchild;// 定义二叉树的左子树 private BinaryTree rchild;// 定义二叉树的右子树 private BinaryTree parent;// 定义二叉树的父节点 private Object data;// 传入的数据类型 /** * * data:传入的初始数据类型 */ public BinaryTree(String data) { this.data = data; } /** * 返回数据 */ public Object getData() { return data; } /** * 设置根节点 */ public void setRoot(BinaryTree root) { this.root = root; } /** * 返回根节点 */ public BinaryTree getRoot() { return root; } /** * 设置父节点 */ public void setParent(BinaryTree parent) { this.parent = parent; } /** * 返回父节点 */ public BinaryTree getParent() { return parent; } /** * 设置左子节点 */ public void setLChild(BinaryTree lchild) { this.lchild = lchild; } /** * 返回左子节点 */ public BinaryTree getLChild() { return lchild; } /** * 设置右子节点 */ public void setRChild(BinaryTree rchild) { this.rchild = rchild; } /** * 返回右子节点 */ public BinaryTree getRChild() { return rchild; } }
定义好以后我们就可以创建一颗二叉树了我们使用表达式2*10-8/(2+2)
/** * 创建二叉树 */ public void creatTree() { BinaryTree biNode_1 = new BinaryTree("-"); BinaryTree biNode_2 = new BinaryTree("*"); BinaryTree biNode_3 = new BinaryTree("/"); BinaryTree biNode_4 = new BinaryTree("2"); BinaryTree biNode_5 = new BinaryTree("10"); BinaryTree biNode_6 = new BinaryTree("8"); BinaryTree biNode_7 = new BinaryTree("+"); BinaryTree biNode_8 = new BinaryTree("2"); BinaryTree biNode_9 = new BinaryTree("2"); root = biNode_1;// 根节点 // 根节点的左右子树 biNode_1.setLChild(biNode_2); biNode_1.setRChild(biNode_3); biNode_2.setLChild(biNode_4); biNode_2.setRChild(biNode_5); biNode_4.setLChild(null); biNode_4.setRChild(null); biNode_5.setLChild(null); biNode_5.setRChild(null); biNode_3.setLChild(biNode_6); biNode_3.setRChild(biNode_7); biNode_6.setLChild(null); biNode_6.setRChild(null); biNode_7.setLChild(biNode_8); biNode_7.setRChild(biNode_9); biNode_8.setLChild(null); biNode_8.setRChild(null); }
设置好所有的左右子树,接下来我们遍历我们建立的这颗二叉树
/** *中序遍历二叉树 */ public void inorderTraversal(BinaryTree r) { if (null != r) { traverse_1(r.getLChild()); System.out.print(r.getData()); traverse_1(r.getRChild()); } }
则打印出来的结果将会是2*10-8/2+2,如果还想算出结果的话,我们首先判断该节点是否有子节点,如果没有那我们确定该节点是数字,我们String类型强转成int行返回,再进行判断如果有子节点,那我们遍历左子树,遍历右子树,获取返回值,根据该节点的运算符号对获取的左右子树进行运算,然后返回结果。那么我们递归到最后就能得到表达式的结果
** * 计算表达式结果 */ public int inorder(BinaryTree t) { // 判断是否是叶子节点 if (null == t.getLChild() && null == t.getRChild()) { return Integer.parseInt((String) t.getData()); } else { inorder(t.getLChild()); // System.out.print(t.getData()); inorder(t.getRChild()); // 获取返回的节点值 int a = inorder(t.getLChild()); int b = inorder(t.getRChild()); if (t.getData().equals("*")) { return a * b; } else if (t.getData().equals("+")) { return a + b; } else if (t.getData().equals("-")) { return a - b; } else if (t.getData().equals("/")) { return a / b; } } return 0; }
发表评论
-
git入门
2015-02-11 11:02 0git入门 -
JVM内存结构浅谈
2013-05-19 14:47 701Java程序的运行过程: ... -
菜鸟入门之网页数据抓取
2013-05-04 21:53 5561有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放 ... -
动态编译
2013-03-01 22:33 629前几天谈论了关于动 ... -
位映射
2013-03-01 22:33 948前些天讨论了位映射的内容,一个具体的例子就对于M个int ... -
线程同步
2013-03-01 22:34 7471,为什么要有线程同 ... -
生产消费模型
2013-03-01 22:34 723当遇到一个线程要产生数据而另一个线程要处理数据时,这就是生 ... -
设计模式之单例模式
2012-12-02 23:02 0单例模式又叫单台模式或者单例模式 -
数据结构之Hash
2012-11-19 21:45 886数据结构之hash 首先介绍两种非常重要的数据结构。数组,为 ... -
数据结构之Hash
2012-11-18 14:47 0数据结构之hash 首先介 ... -
网络通信总结
2012-10-28 15:33 858网络通信:一句话说,用网络传输数据(各种数据) 。进行通讯那 ... -
哈弗曼压缩
2012-08-03 11:43 706一、哈弗曼树,又称最优树,是一种带权路径长度最短的树。 ... -
链表总结
2012-08-03 11:43 809首先,链表是一种顺 ... -
线程及线程应用总结
2012-08-03 11:44 763一、什么是线程 每个java程序都至少有一个线程 ... -
java集合框架
2012-07-16 21:21 755java集合框架总结 主要由以下三部分组成: ... -
I/O体系结构总结
2012-07-16 21:22 923I/O体系结构总结 流的概念和分类: ... -
File相关类总结
2012-07-16 21:22 931File是java中的与文件相关的类,可以对进行创建、删 ... -
java异常机制
2012-07-11 13:01 732JAVA异常机制 一、异常的基本概念 简单的说 ... -
总结20120705
2012-07-05 10:07 691一、类与对象 1. ... -
java关键字总结
2012-05-20 13:31 750常用关键字: 访问修饰符关键字: public: 是最为公 ...
相关推荐
树与二叉树算法总结 树与二叉树是计算机科学中非常重要的一部分,掌握树与二叉树的算法对于数据结构和算法设计非常重要。本文将对树与二叉树的基本概念、性质、运算和应用进行总结。 一、树的基本概念 树是一种非...
"二叉树面试题 树和二叉树总结" 本资源摘要信息涵盖了树和二叉树的面试题总结,包括选择题和解释。涵盖的知识点包括树和二叉树的定义、性质、操作和应用等。 一、树和二叉树的定义 树是一种数据结构,由一个根...
总结来说,树和二叉树是数据结构的基础,它们在搜索、排序、表达复杂数据关系等方面有着广泛的应用。深入理解树的基本概念、术语、表示方法和性质,以及如何用代码实现这些概念,对于学习和使用计算机科学中的高级...
### 数据结构之树和二叉树实验报告知识点详解 #### 实验目的 1. **掌握二叉树的结构特征**: ...通过以上知识点的总结,我们可以更深入地理解二叉树的特性和操作,为进一步的学习和研究打下坚实的基础。
### 数据结构:树与二叉树 #### 一、知识点概览 1. **二叉树的基本概念**:包括二叉树的定义、特点及分类(如完全二叉树、满二叉树等)。 2. **二叉树的性质**:涉及到节点数量与结构之间的关系,比如叶子节点的...
### 数据结构之树与二叉树算法总结 #### 一、引言 在计算机科学领域,数据结构扮演着至关重要的角色。其中,树形结构因其灵活性和高效性被广泛应用于各种场景之中。本文将深入探讨树与二叉树的相关概念,并通过具体...
在这个过程中,每棵树的第一个子节点成为二叉树的左子节点,而同树的其他子节点成为右子节点。 3. **去除连线**:完成转换后,去除之前添加的连线,形成最终的二叉树。 #### 2. 二叉树转换为森林 从二叉树转换回...
4. 平衡二叉树:左右子树高度差不超过1,并且都是平衡二叉树的二叉树称为平衡二叉树,例如AVL树和红黑树。 红黑树是一种自平衡的二叉查找树,它的每个节点都带有颜色属性,可以是红色或黑色。红黑树的主要特性: 1....
根据给定的信息,本文将对数据结构中的树与二叉树相关的算法进行详细的解析与总结。主要内容包括:如何使用二叉树表示算术表达式、二叉树的顺序存储结构及其中叶子节点的计算方法、以及如何递归地构建二叉树并判断其...
自己根据资料对二叉搜索树,B树,红黑树等的基本梳理和总结,一张脑图就能理解,费了一些功夫弄出来的,手里没多少分的就不要下了
题目中提到,在有n个叶子节点的哈夫曼树中,总结点数是2n-1。这意味着除了n个叶子节点外,还有n-1个内部节点,因为每个内部节点连接两个子节点。 接下来,关于二叉链表。在有n个节点的二叉链表中,值为非空的链域的...
- **题目描述**:询问完全二叉树是否一定是平衡二叉树、二叉排序树、堆或哈夫曼树。 - **答案解析**:完全二叉树不一定是平衡二叉树(选项A)。完全二叉树是指除最后一层外,其余各层都是完全充满的,且最后一层的...
总结来说,“树与二叉树”是计算机科学中不可或缺的数据结构,它们提供了一种有效的方式来组织和操作数据。通过理解和掌握二叉树的建立、性质及遍历方法,我们可以更好地设计和实现高效的算法,解决实际问题。在学习...
- **定义:** 二叉树是一种树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。 - **特点:** - 每个节点至多有两个子节点。 - 左右子节点具有顺序性,不能交换位置。 - 可能存在空节点。 **...
树和二叉树相关知识点总结 在计算机科学中,树是一种重要的数据结构,广泛应用于计算机科学和信息技术领域中。本资源将对树和二叉树的相关知识点进行总结和分析。 一、树的基本概念 树是一种非线性数据结构,由...