二叉树

一、树的定义

树:是由n(n>=1)个有限节点组成一个具有层次关系的集合

二、树的术语

(1)节点度:一个节点含有子树的个数称为该节点的度
(2)树的度:一棵树中,最大的节点的度为树的度
(3)叶子节点:度为零的节点
(4)父亲节点:若一个节点含有子节点,则当前节点为改子节点的父亲节点
(5)子节点:一个节点含有子树,则子树的根节点为改节点的子节点
(6)兄弟节点:具有相同父亲节点的子节点互为兄弟节点
(7)节点层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
(8)树的深度(高度):树中节点最大的层次
(9)其他:堂兄弟节点、子孙、森林

三、树的分类

(1)无序树:树中的节点次序是没有规律的
(2)有序树:指树中同层结点从左到右有次序排列,这样的树称为有序树。
1)二叉树:每个节点最多含有两个子树的树称为二叉树
2)非二叉树:所有不是二叉树的树都属于非二叉树


四、二叉树

(1)定义:二叉树是一种特殊的树形结构,每个节点至多只有两颗子树,并且子树有左右之分,其次序不能随意颠倒,是有序树的一种。
注意:二叉树是由一个根结点、两棵互不相交的左子树和右子树组成。
(2)二叉树分类
      1)满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树
     2)完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;


五、完全二叉树性质

(1)若根结点的层次为1,则二叉树第i层最多有2的(i-1)次方个结点。
(2)在高度为k的二叉树中,则最多有2k-1个结点(k≥0)
(3)设一棵二叉树节点个数为n,则父节点个数为n/2。
(4)一棵具有n个结点的完全二叉树,对序号为i(0≤i<n)的结点,则:
   1)若i=0,则i为根结点,无父母结点;若i >0,则i的左右子结点序号为:
           2)若2i+1<n,则i的左孩子结点序号为2i+1;否则i无左孩子。
           3)若2i+2<n,则i的右孩子结点序号为2i+2;否则i无右孩子。

六、构造完全二叉树

(1)定义一个结点类

(2)定义一个构造完全二叉树类,该类内定义一个数组,数组由构造方法传进来;将数组内每个数据构造成结点,再将这些结点构成树,返回根


七、完全二叉树的遍历

(1)先序遍历树
先访问根节点,然后访问左子树,最后访问右子树
(2)中序遍历树
先访问左子树,然后访问根节点,最后访问右子树
(3)后续遍历树
先访问左子树,然后访问右子树,最后访问根节点

完全二叉树构造

package com.test.tree;

/**
 * 二叉树结点类
 * 
 * @author lhz
 * 
 */
public class TreeNode {
	private int Data;
	private TreeNode left;
	private TreeNode right;

	public int getData() {
		return Data;
	}

	public void setData(int data) {
		Data = data;
	}

	public TreeNode getLeft() {
		return left;
	}

	public void setLeft(TreeNode left) {
		this.left = left;
	}

	public TreeNode getRight() {
		return right;
	}

	public void setRight(TreeNode right) {
		this.right = right;
	}

}


package com.test.tree;

import java.util.LinkedList;

/**
 * 二叉树算法
 * 
 * @author lhz
 * 
 */
public class MyTreeList {
	private int value[];// 数组
	private LinkedList<TreeNode> list = new LinkedList<TreeNode>();

	public MyTreeList(int[] value) {
		this.value = value;
	}

	/**
	 * 构造二叉树
	 */
	public TreeNode createTree() {
		for (int i = 0; i < value.length; i++) {
			TreeNode node = new TreeNode();
			node.setData(value[i]);// 所有的数据构成结点
			list.add(node);// 放入容器中
		}
		// 构造二叉树
		for (int i = 0; i < list.size() / 2 - 1; i++) {// 遍历除了最后一个父节点以外的所有父节点
			list.get(i).setLeft(list.get(2 * i + 1));
			list.get(i).setRight(list.get(2 * i + 2));
		}
		// 最后一个父结点必定会有左孩子
		// 获取最后一个父结点的索引,从0开始
		int lastNode = list.size() / 2 - 1;
		list.get(lastNode).setLeft(list.get(2 * lastNode + 1));
		// 看有没有右孩子
		if (list.size() % 2 == 1) {// 奇数个结点,必定有右孩子
			list.get(lastNode).setRight(list.get(2 * lastNode + 2));
		}
		// 返回根,即头结点
		return list.getFirst();
	}

	/**
	 * 先序遍历二叉树
	 */
	public void searchFirst(TreeNode root) {
		// 先根
		System.out.println(root.getData());
		// 左树
		if (root.getLeft() != null) {
			searchFirst(root.getLeft());
		}
		// 右树
		if (root.getRight() != null) {
			searchFirst(root.getRight());
		}
	}

	/**
	 * 中序遍历
	 */
	public void searchMiddle(TreeNode root) {
		// 左树
		if (root.getLeft() != null) {
			searchMiddle(root.getLeft());
		}
		// 根
		System.out.println(root.getData());
		// 右树
		if (root.getRight() != null) {
			searchMiddle(root.getRight());
		}
	}

	/**
	 * 后序遍历
	 */
	public void searchLast(TreeNode root) {
		// 左树
		if (root.getLeft() != null) {
			searchLast(root.getLeft());
		}
		// 右树
		if (root.getRight() != null) {
			searchLast(root.getRight());
		}
		// 根
		System.out.println(root.getData());
	}
}


package com.test.tree;

/**
 * 测试类
 * 
 * @author lhz
 * 
 */
public class TreeTest {
	public static void main(String[] args) {
		int value[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		MyTreeList mtl = new MyTreeList(value);
		TreeNode root = mtl.createTree();
		// mtl.searchFirst(root);
		// mtl.searchMiddle(root);
		mtl.searchLast(root);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值