赞
踩
树状图是一种数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。
名字 | 描述 |
---|---|
结点 | 树中的每个元素 ,存储数据元素和指向子树的链接,由数据元素和构造数据元素之间关系的引用组成 |
孩子结点 | 树中一个结点的子树的根结点称为这个结点的孩子结点 |
双亲结点 | 树中某个结点有孩子结点(即该结点的度不为0),该结点称为它孩子结点的双亲结点,也叫前驱结点。双亲结点和孩子结点是相互的 |
兄弟结点 | 具有相同双亲结点(即同一个前驱)的结点称为兄弟结点 |
堂兄弟结点 | 双亲在同一层的结点互为堂兄弟 |
结点的度 | 结点所有子树的个数称为该结点的度 |
子孙 | 以某结点为根的子树中任一结点都称为该结点的子孙 |
森林 | 由m(m>=0)棵互不相交的树的集合称为森林 |
结点的祖先 | 从根到该结点所经分支上的所有结点 |
树的度 | 树中所有结点的度的最大值称为树的度 |
叶子结点 | 度为0的结点称为叶子结点,也叫终端结点 |
分支结点 | 度不为0的结点称为分支结点,也叫非终端结点 |
结点的层次 | 从根结点到树中某结点所经路径的分支数称为该结点的层次。根结点的层次一般为1(也可以自己定义为0),这样,其它结点的层次是其双亲结点的层次加1 |
树的深度 | 树中所有结点的层次的最大值称为该树的深度(也就是最下面那个结点的层次) |
种类名字 | 描述 |
---|---|
无序树 | 树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树 |
有序树 | 树中任意节点的子结点之间有顺序关系,这种树称为有序树 |
二叉树 | 每个节点最多含有两个子树的树称为二叉树 |
完全二叉树 | 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树 |
满二叉树 | 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树 |
哈夫曼树 | 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近 |
1.树的数据结构
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
2.前序遍历
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树(递归实现)。
public static void PreOrder(TreeNode head) {
if (head == null) {
return;
}
System.out.print(head.val + " ");
PreOrder(head.left);
PreOrder(head.right);
}
3.中序遍历
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树(递归实现)。
public static void InOrder(TreeNode head) {
if (head == null){
return;
}
InOrder(head.left);
System.out.print(head.val + " ");
InOrder(head.right);
}
4.后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点(递归实现)。
public static void PostOrder(TreeNode head) {
if (head == null){
return;
}
PostOrder(head.left);
PostOrder(head.right);
System.out.print(head.val + " ");
}
5.层次遍历
层次遍历直接按照二叉树层次对每一层进行遍历
public static void levelOrder(TreeNode head) {
if (head == null){
return;
}
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.add(head);
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
System.out.print(temp.val);
if (temp.left != null)
queue.add(temp.left);
if (temp.right != null)
queue.add(temp.right);
}
}
6.二叉树的高度
递归计算出左子树与右子树的高度,找出左子树与右子树高度的较大者,最后加1,得出二叉树的高度
public static int depth(TreeNode head) {
int h1, h2;
if (head == null) {
return 0;
} else {
h1 = deep(head.left);
h2 = deep(head.right);
return (h1 < h2) ? h2 + 1 : h1 + 1;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。