二叉树学习笔记

1、二叉树的定义

        二叉树(Binary Tree)是n(n≥0)个结点组成的有限集合,n=0时称为空二叉树;n>0的二叉树由一个根结点和两棵互不相交、分别称为左子树和右子树的子二叉树构成,二叉树也是递归定义的,在树种定义的度、层次等术语,同样适用于二叉树。

2、二叉树的5种基本形态

3、二叉树的主要性质

1)若根结点的层次为1,则二叉树第i层上的结点数目最多为2i−1(i≥1);

2)在高度为h的二叉树中,最多有2k−1个结点(k≥0);

3)包含n个结点的二叉树的高度至少为(log2n)+1;

4)在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

4、满二叉树、完全二叉树和二叉查找树

4.1 满二叉树

        一棵高度为h的满二叉树(Full Binary Tree)是具有2h−1(h≥0)2h−1(h≥0)个结点的二叉树。满二叉树的最大特点是每一层次的结点数都达到最大值,我们可以对满二叉树的结点进行连续编号并约定根结点的序号为0,从根结点开始,自上而下,每层自左向右编号。

二叉树学习笔记_第1张图片

4.2 完全二叉树

        对于完全二叉树,假设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

二叉树学习笔记_第2张图片

4.3 二叉查找树

        二叉查找树又被称为二叉搜索树。设x为二叉查找树中的一个结点,x结点包含关键字key,结点x的key值计为key[x]。如果y是x的左子树中的一个结点,则key[y]<=key[x];如果y是x的右子树的一个结点,则key[y]>=key[x]

在二叉查找树中:

1)若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2)任意结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3)任意结点的左、右子树也分别为二叉查找树;

4)没有键值相等的结点。

5、二叉树的遍历

5.1 先序遍历(DLR)

  1):访问根节点;

  2):按先序遍历访问左子树;

  3):按先序遍历访问右子树。

5.2 中序遍历(LRD)

 1):按中序遍历左子树;

 2):访问根节点;

 3):按中序遍历访问右子树。

5.3 后序遍历

 1):按后序遍历访问左子树;

 2):按后序遍历访问右子树;

 3):访问根节点。

以下图为列,用java实现:

java具体代码如下:

package com.px.cn;

import java.util.ArrayList;
import java.util.List;

public class BinTree {
	private BinTree lChild;//左孩子
	private BinTree rChild;//右孩子
	private BinTree root;//根节点
	private Object data; //数据域
	private List datas;//存储所有的节点
	public BinTree(BinTree lChild, BinTree rChild, Object data) {
		super();
		this.lChild = lChild;
		this.rChild = rChild;
		this.data = data;
	}
	public BinTree(Object data) {
		this(null, null, data);
	}
	public BinTree() {
		super();
	}
	
	public void createTree(Object[] objs){
		datas=new ArrayList();
		for (Object object : objs) {
			datas.add(new BinTree(object));
		}
		root=datas.get(0);//将第一个作为根节点
		for (int i = 0; i < objs.length/2; i++) {
			datas.get(i).lChild=datas.get(i*2+1);
			if(i*2+2

输出结果如下:

这是先序遍历的结果:0 1 3 7 4 2 5 6 
这是中序遍历的结果:7 3 1 4 0 5 2 6 
这是后序遍历的结果:7 3 4 1 5 6 2 0 

你可能感兴趣的:(数据结构)