Java数据结构之二叉树

一.定义:

树状图是一种数据结构,它是由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;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值