`
guanxianxiao
  • 浏览: 18714 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

二叉树浅解

阅读更多
二叉树
1、定义:树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。
二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”和“右子树”。
链表是一种特殊的树。

2、构建规则:左子树<右子树

3、组成元素:根节点 、边、左(右)子树


二叉树的遍历方式
1、前序 、先序   :根节点 -->左-->右 访问根结点的操作发生在遍历其左右子树之前。
2、中序 :左 -->根节点-->右 访问根结点的操作发生在遍历其左右子树之中(间)。
3、后序 :左 -->右-->根节点 访问根结点的操作发生在遍历其左右子树之后。
4、层次
5、
6、广度

1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。

2.先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。

练习:
1、构建树结构
2、分别实现 前、中、后序的遍历

结点类:
public class Node {
//	节点存储的数据
	private Object date;
//	左节点的地址
	private Node left;
//	右节点的地址
	private Node right;
	
//	返回节点处的数据	
	public Object getDate() {
		return date;
	}
//	设置节点处的数据
	public void setDate(Object date) {
		this.date = date;
	}
//	返回左节点
	public Node getLeft() {
		return left;
	}
//	设置左节点
	public void setLeft(Node left) {
		this.left = left;
	}
//	返回右节点
	public Node getRight() {
		return right;
	}
//	设置右节点
	public void setRight(Node right) {
		this.right = right;
	}

	
//	构造函数	
	public Node() {
		super();
	}
//	构造函数
	public Node(Object date) {
		super();
		this.date = date;
	}
//  构造函数
	public Node(Object date, Node left, Node right) {
		this.date = date;
		this.left = left;
		this.right = right;
	}

}


树类:

public class NodeTree {
	
//	定义一个根节点
	private Node root;
	
	/**
	 * 添加节点 的方法
	 * @param node 要添加的代码
	 */
	public void add(Node node){
		if(root==null){
			root = node;
		}
		else{
			querynode1(root,node);
		}
	}
	
	/**
	 * 查找节点添加位置并添加的方法
	 * @param node1  根节点
	 * @param node2 要添加的节点
	 */
	public void querynode1(Node node1,Node node2){
		if((int)node2.getDate()<(int)node1.getDate()){
			if(node1.getLeft()==null){
				node1.setLeft(node2);
			}
			else{
				querynode1(node1.getLeft(),node2);
			}
		}
		else{
			if(node1.getLeft()==null){
				node1.setLeft(node2);
			}
			else if(node1.getRight()==null){
				node1.setRight(node2);
			}
			else{
				querynode1(node1.getRight(),node2);
			}
		}
		
	}

	/**
	 * 前序遍历
	 * @param node 根节点
	 */
	public void NLR(Node node){
//		访问根节点
		System.out.print(node.getDate()+"\t");
		
//		访问左子树
		if(node.getLeft()!=null){//左子树不为空
				NLR(node.getLeft());
		}
//		访问右子树
		if(node.getRight()!=null){//右子树不为空
			NLR(node.getRight());
		}
		
	}
	
	/**
	 * 中序遍历
	 * @param node 根节点
	 */
	public void LNR(Node node){
//		遍历左子树
		if(node.getLeft()==null){
			System.out.print(node.getDate()+"\t");
		}
		else{
			LNR(node.getLeft());
		}
//		遍历根节点
		if(node.getLeft()!=null){
			System.out.print(node.getDate()+"\t");
		}
//		遍历右子树
		if(node.getRight()!=null){
			LNR(node.getRight());
		}
	}
	
	/**
	 * 后序遍历
	 * @param node   根节点
	 */
	public void LRN(Node node){
//		遍历左树
		if(node.getLeft()==null){
			System.out.print(node.getDate()+"\t");
		}
		else{
			LRN(node.getLeft());
		}
//		遍历右树
		if(node.getRight()!=null){
			LRN(node.getRight());
		}
//		遍历根节点
		if(node.getLeft()!=null){
			System.out.print(node.getDate()+"\t");
		}
		
	}
	
	public void delete(Node node){
//		遍历查找
//		访问根节点
		System.out.print(node.getDate()+"\t");
		
//		访问左子树
		if(node.getLeft()!=null){//左子树不为空
				NLR(node.getLeft());
		}
//		访问右子树
		if(node.getRight()!=null){//右子树不为空
			NLR(node.getRight());
		}
	}	
	
}



主函数:
public class Manager {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		NodeTree nt = new NodeTree();
		Node[] node = new Node[8];
		node[0] = new Node(100);
		node[1] = new Node(90);
		node[2] = new Node(120);
		node[3] = new Node(80);
		node[4] = new Node(95);
		node[5] = new Node(110);
		node[6] = new Node(125);
		node[7] = new Node(85);
		for(int i =0; i<node.length;i++){
			nt.add(node[i]);
		}
//		前序遍历
		System.out.println("前序遍历输出~~~~~~~~~~~");
		nt.NLR(node[0]);
		System.out.println();
		
//		中序遍历
//		System.out.println("中序遍历输出~~~~~~~~~~~");
//		nt.LNR(node[0]);
//		System.out.println();
		
//		后序遍历
//		System.out.println("后序遍历输出~~~~~~~~~~~");
//		nt.LRN(node[0]);
//		System.out.println();
		
//		nt.delete(node[3]);
	}

}

分享到:
评论

相关推荐

    二叉树二叉树二叉树二叉树二叉树

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    二叉树排序二叉树排序

    二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序二叉树排序

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    判断二叉树是否为完全二叉树

    在二叉树类binarytree中增加一个功能,判断是否为完全二叉树(使用自定义的队列类完成)

    判断二叉树是否是完全二叉树

    编写算法判别给定二叉树是否为完全二叉树。

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    二叉树左右遍历次数解

    二叉树遍历、函数解左右遍历次数。不知道这种解法如何,还望指教。多多益善,感激不尽。

    二叉树的建立与基本操作

    编写程序实现二叉树的如下操作: 1) 建立二叉链表 2) 二叉树的先序、中序、后序遍历 3) 求解二叉树的叶子结点个数 4) 将二叉树中所有结点的左、右子树相互交换 输入:  扩展二叉树先序序列:ab#d##ce###。其中#...

    数据结构二叉树操作;C#二叉树;C#数据结构二叉树

    数据结构二叉树操作;C#二叉树;C#数据结构二叉树数据结构二叉树操作;C#二叉树;C#数据结构二叉树数据结构二叉树操作;C#二叉树;C#数据结构二叉树数据结构二叉树操作;C#二叉树;C#数据结构二叉树

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

    二叉树2.dsw

    二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的基本功能实现,你二叉树的...

    二叉树模板代码 二叉树习题

    二叉树模板代码 二叉树 作业习题 二叉树模板代码 二叉树 作业习题 二叉树模板代码 二叉树 作业习题

    erchashu.txt.tar.gz_二叉树_二叉树的复制

    实现二叉树链表表示的二叉树: 建立一棵二叉树; 按先序、中序和后序遍历二叉树; 按层次遍历; 求一棵二叉树的高度; 交换一棵二叉树的左右子树; 复制一棵二叉树。

    二叉树相关算法的实验验证+判别给定二叉树是否为完全二叉树。

    1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...

    将满二叉树转化为求和二叉树_二叉树_

    输入共3行:第一行为满二叉树中结点个数n(n&lt;1024);第二行为n个整数,表示二叉树的先序遍历序列;第三行也有n个整数,表示二叉树的中序遍历序列。整数间以空格分割。

    PHP实现二叉树图

    PHP实现二叉树图

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    二叉树课程设计的实验报告

    3 程序所能达到的功能:生成一个新的二叉树,实现对二叉树的先序,中序,后序和层次遍历,计算二叉树的深度,结点数,叶结点数,。 4 测式数据: A生成一个新的二叉树后,直接在键盘上按要求输入字符,可以依次输入...

    求二叉树的深度

    采用先序法建立一棵二叉树,设计求该二叉树的深度,二叉树的数据域类型为字符型, 扩展二叉树的叶子结点用‘#’表示,要求可以求多棵二叉树的深度,当二叉树的深度为0时程序结束。

Global site tag (gtag.js) - Google Analytics