`
bannamoon
  • 浏览: 53454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据结构学习之二叉树

    博客分类:
  • JAVA
阅读更多
TreeNode.java
public class TreeNode implements Cloneable {

	private Object data;
	private TreeNode leftChild;
	private TreeNode rightChild;
	private TreeNode parent;
	private int level;
	private int lLevel;
	private int rLevel;
	
	public TreeNode(Object data){
		this(data, null, null, null);
	}
	public TreeNode(Object data, TreeNode lc, TreeNode rc, TreeNode p){
		this.data = data;
		this.leftChild = lc;
		this.rightChild = rc;
		this.parent = p;
	}

	public Object clone(){
		return new TreeNode(this.data);
	}
	
	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public TreeNode getLeftChild() {
		return leftChild;
	}

	public void setLeftChild(TreeNode leftChild) {
		this.leftChild = leftChild;
	}

	public TreeNode getRightChild() {
		return rightChild;
	}

	public void setRightChild(TreeNode rightChild) {
		this.rightChild = rightChild;
	}

	public TreeNode getParent() {
		return parent;
	}

	public void setParent(TreeNode parent) {
		this.parent = parent;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	public int getlLevel() {
		return lLevel;
	}
	public void setlLevel(int lLevel) {
		this.lLevel = lLevel;
	}
	public int getrLevel() {
		return rLevel;
	}
	public void setrLevel(int rLevel) {
		this.rLevel = rLevel;
	}
}

BinaryTree.java
public class BinaryTree {
	public static final boolean LEFT = true;
	public static final boolean RIGHT = false;
	private TreeNode root  = null;
	private int level = 0;//树高
	private int lLevel = 0;//左树高
	private int rLevel = 0;//右树高
	private int nodeNumber = 0;//节点树
	private List<TreeNode> preOrderList = new ArrayList<TreeNode>();
	private List<TreeNode> inOrderList = new ArrayList<TreeNode>();
	private List<TreeNode> postOrderList = new ArrayList<TreeNode>();
	private List<TreeNode> levelOrderList = new ArrayList<TreeNode>();
	private List<TreeNode> levelQueue = new ArrayList<TreeNode>();
	
	public TreeNode getRoot() {
		return root;
	}

	public int getLevel() {
		return level;
	}

	public int getNodeNumber() {
		return nodeNumber;
	}
	
	public int getlLevel() {
		return lLevel;
	}

	public int getrLevel() {
		return rLevel;
	}

	public List<TreeNode> getPreOrderList() {
		return preOrderList;
	}

	public List<TreeNode> getInOrderList() {
		return inOrderList;
	}

	public List<TreeNode> getPostOrderList() {
		return postOrderList;
	}

	public List<TreeNode> getLevelOrderList() {
		return levelOrderList;
	}

	/**
	 * 插入节点,如果父节点已有要插入的左孩子或者右孩子,
	 * 则根据要插入节点类型左孩子或者右孩子查找父节点对应孩子继续插入
	 * 参数parent为空,则表示为插入树的根节点
	 * @param parent 父节点
	 * @param node 子节点
	 * @param flag true-左孩子 false-右孩子
	 */
	public void insertNode(TreeNode parent, TreeNode node, boolean flag){
		if(parent  == null){
			this.root = node;
			node.setLevel(1);
			this.nodeNumber++;//节点数增加1
			this.level++;//树高增加1
			return;
		}
		if(flag == BinaryTree.LEFT){
			TreeNode parentLeftChild = parent.getLeftChild();
			if(parentLeftChild == null){
				parent.setLeftChild(node);
				node.setParent(parent);
			}else{
				insertNode(parentLeftChild, node, flag);
			}
		}else{
			TreeNode parentRightChild = parent.getRightChild();
			if(parentRightChild == null){
				parent.setRightChild(node);
				node.setParent(parent);
			}else{
				insertNode(parentRightChild, node, flag);
			}
		}
		node.setLevel(parent.getLevel()+1);
		this.nodeNumber++;//节点数增加1
		this.level = node.getLevel()>this.level ? node.getLevel() : this.level;
	}
	
	/**
	 * 先序遍历
	 * @return
	 */
	public void preOrderTraverse(TreeNode node){
		if(node==null) return;
		this.preOrderList.add((TreeNode)node.clone());
		preOrderTraverse(node.getLeftChild());
		preOrderTraverse(node.getRightChild());
	}
	
	/**
	 * 中序遍历
	 * @return
	 */
	public void inOrderTraverse(TreeNode node){
		if(node==null) return;
		inOrderTraverse(node.getLeftChild());
		this.inOrderList.add((TreeNode)node.clone());
		inOrderTraverse(node.getRightChild());
	}
	
	/**
	 * 后序遍历
	 * @return
	 */
	public void postOrderTraverse(TreeNode node){
		if(node==null) return;
		postOrderTraverse(node.getLeftChild());
		postOrderTraverse(node.getRightChild());
		this.postOrderList.add((TreeNode)node.clone());
	}
	
	/**
	 * 层序遍历
	 * @return
	 */
	public void levelOrderTraverse(TreeNode node){
		if(node == null) return;
		if(node.getLeftChild()!=null) 
			this.levelQueue.add(node.getLeftChild());
		if(node.getRightChild()!=null) 
			this.levelQueue.add(node.getRightChild());
		this.levelOrderList.add((TreeNode)node.clone());
		if(levelQueue.size()>0)
			levelOrderTraverse(levelQueue.remove(0));
	}
}

BinaryTreeMain.java
public class BinaryTreeMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TreeNode a = new TreeNode("a");
		TreeNode b = new TreeNode("b");
		TreeNode c = new TreeNode("c");
		TreeNode d = new TreeNode("d");
		TreeNode e = new TreeNode("e");
		TreeNode f = new TreeNode("f");
		TreeNode g = new TreeNode("g");
		BinaryTree tree = new BinaryTree();
		tree.insertNode(null, a, BinaryTree.LEFT);
		tree.insertNode(a, b, BinaryTree.LEFT);
		tree.insertNode(b, c, BinaryTree.LEFT);
		tree.insertNode(b, d, BinaryTree.RIGHT);
		tree.insertNode(d, e, BinaryTree.LEFT);
		tree.insertNode(d, f, BinaryTree.RIGHT);
		tree.insertNode(e, g, BinaryTree.RIGHT);
		int level = tree.getLevel();
		int number = tree.getNodeNumber();
		tree.inOrderTraverse(tree.getRoot());
		tree.preOrderTraverse(tree.getRoot());
		tree.postOrderTraverse(tree.getRoot());
		tree.levelOrderTraverse(tree.getRoot());
		List<TreeNode> pre = tree.getPreOrderList();
		List<TreeNode> in = tree.getInOrderList();
		List<TreeNode> post = tree.getPostOrderList();
		List<TreeNode> levelList = tree.getLevelOrderList();
		System.out.println("----------------");
	}
}
分享到:
评论

相关推荐

    数据结构--二叉树--思维导图.pdf

    "数据结构--二叉树--思维导图" 二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个孩子节点,分别是左子树和右子树。二叉树可以用来存储大量数据,并且可以快速地查找、插入和删除数据。 二叉树的...

    数据结构 树和二叉树ppt教程

    【数据结构:树和二叉树】 树是一种非线性的数据结构,它的基本概念和术语在计算机科学中至关重要,尤其在算法设计和数据组织中扮演着核心角色。树的定义基于递归,一棵非空树包含一个根节点,以及一组互不相交的...

    数据结构实验之二叉树

    总的来说,这个“数据结构实验之二叉树”旨在帮助学习者掌握二叉树的基本概念、遍历方法以及如何在实际应用中(如使用MFC)实现这些概念。通过这个实验,不仅可以锻炼编程技能,还能提高对数据结构的理解,为未来的...

    数据结构实验(二叉树)

    在IT领域,数据结构是计算机...总的来说,二叉树是数据结构学习的关键部分,理解和熟练运用二叉树对于提升算法和数据结构的综合能力至关重要。在实验过程中,不断实践和优化代码,将有助于你更好地掌握这一重要概念。

    数据结构之树二叉树必看

    二叉树是计算机科学中数据结构的一个重要概念,它在许多算法和问题解决中起着核心作用。在深入探讨之前,我们先理解一下二叉树的基本定义:二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为...

    数据结构树和二叉树遍历二叉树和线索二叉树PPT学习教案.pptx

    "数据结构树和二叉树遍历二叉树和线索二叉树PPT学习教案.pptx" 本资源主要讲述了数据结构树和二叉树遍历的相关知识点,包括二叉树的基本概念、二叉树遍历的六种方案、先序、中序、后序遍历算法的实现、线索二叉树的...

    数据结构C语言版二叉树及其查找结构

    本资源提供了详细的数据结构C语言版二叉树及其查找结构的知识点,包括树的定义、树的特点、二叉树的基本形态、 二叉树的性质、二叉树的存储结构和普通树转换成二叉树等方面的内容,对学习数据结构的新手有很大的帮助...

    编程数据结构之二叉树讲义

    【二叉树】是数据结构中的重要组成部分,它是一种特殊的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。...学习二叉树有助于深入理解数据结构的底层逻辑,是计算机科学基础教育的重要部分。

    数据结构课程设计报告-二叉树的遍历.docx

    11. 心得体会:通过本次课程设计,学生可以学到递归创建和非递归创建二叉树等有关二叉树的基本知识,并提高动手能力和学习数据结构的能力。 12. 数据结构的重要性:数据结构是计算机科学和信息技术的基础,学习数据...

    数据结构 C语言建立二叉树

    总的来说,理解和实现二叉树在C语言中的操作是数据结构学习的重要部分。通过实际编码练习,不仅可以巩固理论知识,还能提高解决实际问题的能力。在软件开发中,二叉树常用于搜索、排序和索引等任务,因此熟练掌握...

    《数据结构课程设计》二叉树基本操作实验程序(10种基本操作)

    二叉树作为数据结构的一种,是数据结构课程设计中的重要学习内容。在这个《数据结构课程设计》项目中,我们专注于二叉树的基本操作,通过两个源文件(file1.cpp 和 file2.cpp)以及一个头文件(head.h)实现了一系列...

    数据结构课程设计—二叉树.zip

    数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和检索数据,以优化程序的性能。二叉树是数据结构中的一...通过学习和实践,你将能够更好地理解和运用这一重要的数据结构,为未来的编程工作打下坚实的基础。

    线索二叉树(数据结构课设)

    线索二叉树是一种特殊形式的二叉树,...在数据结构的学习中,理解和掌握线索二叉树的构造与操作是提升算法能力的关键步骤。通过实际编写和调试代码,学生可以更好地领会这种数据结构的工作原理及其在实际问题中的应用。

    数据结构树与二叉树的ppt

    数据结构中的树与二叉树是计算机科学中基础且重要的概念,它们被广泛应用于软件开发、数据库设计、算法分析等领域。清华大学出版社的数据结构教材详细介绍了这些概念,旨在帮助读者理解和掌握这一领域的核心知识。 ...

    数据结构 C++ STL 二叉树

    在IT领域,数据结构是计算机科学的基础,而二叉树作为一种重要的数据结构,广泛应用于算法设计和程序开发中。C++ Standard Template Library (STL) 提供了对多种数据结构和算法的支持,其中包括对二叉树的操作。在这...

    数据结构程序之二叉树

    在IT领域,数据结构是计算机科学的基础,它研究如何有效地组织和存储数据,以便于算法的执行。...通过分析“数据结构之二叉树”这个压缩包中的内容,你将有机会亲手实现这些概念,并通过实践加深理解。

    东北大学数据结构实验3 树和二叉树

    ### 东北大学数据结构实验3:树和二叉树 #### 实验背景 本次实验是针对东北大学计算机专业本科生的数据结构课程中的一项实践任务。实验的主要目的是帮助学生深入理解和掌握树形数据结构中的两种基本类型——树...

    广工数据结构实验——平衡二叉树

    本实验“广工数据结构实验——平衡二叉树”着重探讨了一种特殊类型的数据结构,即平衡二叉树。平衡二叉树是二叉搜索树(Binary Search Tree, BST)的一个变体,它通过保持树的高度平衡来确保查找、插入和删除操作的...

    2015广工数据结构实验--平衡二叉树(包含源码和实验报告

    在IT领域,数据结构是计算机科学的基础之一,它关乎如何高效地存储和处理数据。平衡二叉树(Balanced Binary Tree)是数据结构中的一个重要概念,尤其在算法设计和数据库系统中发挥着关键作用。本实验是针对广东工业...

Global site tag (gtag.js) - Google Analytics