赞
踩
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
有一个特殊的节点,称为根节点,根节点没有前驱节点除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合Ti (1 <= i <= m) 又是一棵与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0个或多个后继。树是递归定义的。
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右
子树的二叉树组成。
二叉树的特点:
上图给出了几种特殊的二叉树形态,从左往右依次是:空树、只有根节点的二叉树、节点只有左子树、
节点只有右子树、节点的左右子树均存在,一般二叉树都是由上述基本形态结合而形成的。
二叉树的存储结构分为:顺序存储和类似于链表的链式存储。
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,具体如下:
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
// 前序遍历 void preOrderTraversal(Node root); // 中序遍历 void inOrderTraversal(Node root); // 后序遍历 void postOrderTraversal(Node root); // 遍历思路-求结点个数 static int size = 0; void getSize1(Node root); // 子问题思路-求结点个数 int getSize2(Node root); // 遍历思路-求叶子结点个数 static int leafSize = 0; void getLeafSize1(Node root); // 子问题思路-求叶子结点个数 int getLeafSize2(Node root); // 子问题思路-求第 k 层结点个数 int getKLevelSize(Node root); // 获取二叉树的高度 int getHeight(Node root); // 查找 val 所在结点,没有找到返回 null // 按照 根 -> 左子树 -> 右子树的顺序进行查找 // 一旦找到,立即返回,不需要继续在其他位置查找 Node find(Node room, int val)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。