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

数组转换成二叉树

阅读更多

前面介绍了双向链表,其实二叉树也相当于一个链表。二叉树相对而言比较好理解,我们可以把其看做成一棵树,只不过每个结点至多只有2个枝节点,且仅且只有一个根结点,这就是二叉树。二叉树的定义其实和链表差不多,双向链表是和其前后结点相连,而二叉树的结点就必须和其左右枝节点保持关系。与链表类似,可以这样定义二叉树:

 

public class TreeNode {
	private Object obj;
	private TreeNode parent;
	private TreeNode left;
	private TreeNode right;
	//重写构造方法
	public TreeNode(Object obj){
		this.obj=obj;
	}
	
	public Object getObj() {
		return obj;
	}
	public void setObj(Object obj) {
		this.obj = obj;
	}
	public TreeNode getParent() {
		return parent;
	}
	public void setParent(TreeNode parent) {
		this.parent = parent;
	}
	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;
	}
	
}

 

二叉树定义好后,这个时候想把一个int数组转化成二叉树,我们就得定义好建树的规则。没有规则,是很难建树,即使建成了,也未必和我们想的一样。建二叉树就必须先建好根结点,按理说,取数组中最中间的数当作根结点是最好的,当为了重新对数组进行排序,可以简单的取数组的第一个元素当作其根结点。这时根结点建好后,然后依次取数组里面的数,往根结点的左右两端连接,做其枝结点。这个时候为了使建成的树是唯一的,建树的规则为:

当遇到比结点小的数时,这个数成为其左孩子,当遇到不小于比结点数时,成为其右孩子。

先定义一个把一个数插入到二叉树中的方法:

/**
	 * 将一个数插入二叉树中
	 * @param node	在这个结点下插入新的结点
	 * @param value	
	 */
	public void addToTree(TreeNode node, int value){  
		if((Integer)node.getObj()>value){
			//当前结点的值比value大,则成为其左子结点
			if(node.getLeft()!=null){
				//看这个结点的左子结点是否存在,如果存在
				node=node.getLeft();
				//递归调用该方法
				addToTree(node, value); 
			}else{
				//不存在
				TreeNode TNode=new TreeNode(value); 
				TNode.setParent(node);   
                node.setLeft(TNode); 
			}	
		}
		else{
			//当前结点的值比value小,则成为其右子结点
			if (node.getRight() != null) { 
				//看这个结点的右子结点是否存在,如果存在
				node = node.getRight();   
				addToTree(node, value);   
            }else{   
            	//不存在
            	TreeNode TNode=new TreeNode(value);  
            	TNode.setParent(node);   
                node.setRight(TNode);   
            }   
		}
	}

 使用递归,直到这个数插入到二叉树中。一个数既然能插入到树中,那一个数组里面的元素也能插入树中,从而建成一棵二叉树:

/**
	 * 将一个数组转化为一个二叉树
	 * @param array
	 * @return
	 */
	public TreeNode arrayToTree(int [] array){
		if(array.length == 0){   
            throw new RuntimeException("数组长度为0,没有元素用来建树!!!");   
        } 
		//把第一个元素变成根结点
        int first = array[0];   
        root = new TreeNode(first);   
        for (int i = 1; i < array.length; i++) {   
        	addToTree(root, array[i]); 
        }   
		return root;
	}

 随便创建一个整数数组,在主函数里面调用这些方法就可以建成一棵二叉树。

<!--EndFragment-->
<!--EndFragment--><!--EndFragment-->
分享到:
评论

相关推荐

    LeetCode精选TOP面试题108.将有序数组转换为二叉搜索树

    题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的...将有序数组转换为二叉搜索树的结果肯定是不唯一的,因为存在多种建树方法。

    合肥工业大学数据结构试验三二叉树

    将按顺序方式存储在数组中的二叉树转换为二叉链表形式。 复制一棵二叉树T到T1。 交换二叉树中每个结点的左右孩子指针的值。 设计算法以实现下面所提到以扩展二叉树的先序序列作为输入构建二叉树的功能。

    leetcodetreenode-leettree:使用像LeetCode这样的层序遍历将数组转换为二叉树,反之亦然。用于测试LeetCode

    这样的层序遍历将数组转换为二叉树,反之亦然! 参见 LeetCode FAQ 关于使用 array 的二叉树表示。 安装 npm install leettree 用法 反序列化和序列化 // in node.js environment. // you can use ES6 import too. ...

    python 将有序数组转换为二叉树的方法

    主要介绍了python 将有序数组转换为二叉树的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    分别对无序数组和有序数组建立二叉树,实现遍历和查找

    关于二叉树的程序,分别对无序数组和有序数组建立二叉树,实现遍历和查找。

    图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树.pptx

    图+查找+排序+循环链表+循环链表+数组+广义表+二叉树与树的转换+哈夫曼树

    算法笔记,将有序数组转为二叉搜索树

    算法笔记,将有序数组转为二叉搜索树

    二叉树实验

    求二叉树的高度,按中序方式输出二叉树中各结点的值及其对应的层次数,设计算法将顺序方式形式存储在数组中的二叉树转换为二叉链表形式

    二叉树遍历

    4,须借助队列建立二叉树的层序遍历,可以用数组转换成队列,不用单独建立队列; 5,二叉树输入应为完全二叉树形式,没有字符用空格表示; 6,程序执行的命令为: 1)建立堆栈和队列;2)建立,输入...

    php FLEA中二叉树数组的遍历输出

    最近在做一个项目其中涉及到“无限级回复”,FLEA中中有一个关于数组的辅助类:FLEA_Helper_Array,这个类里面有一个非常强大的数组处理方法:array_to_tree,这个方法可以把二维数组转换为二叉树结构

    C++数据结构-二叉树和线索二叉树

    添加、删除、拷贝、清空、树深度计算、父节点、兄弟节点获取、先中后序递归及非遍历、按层次遍历、中序迭代器(非递归算法)、节点查找、先序和中序序列重建二叉树、数组和二叉链表存储结构相互转换。使用模板偏特化...

    第五章 树与二叉树

    2.森林转换成二叉树 (1)将森林中的每一棵二叉树转化成二叉树; (2)从第二课二叉树开始,依次把后一棵二叉树的根结点作为一棵二叉树根节点的右孩子,当所有二叉树连起来后,此时所得到的二叉树就是由森林转换得到...

    D3思维导图案例+二叉树数据转json数组

    服务端提供的是二叉树的数据结构,D3只是需要普通的json数组结构,所以写了一个递归进行转换。可以点击收纳,可以点击添加。不能拖拽~

    vcmianshi.rar_c++ thread_算法笔试面试_算法面试题_马戏团

    将一个数组转换成一个二叉树,求整数的最小质数,将一个英文句子(字符串)倒序排列,百钱买百鸡问题,输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,....

    红黑二叉树详细简介以及使用

    度超过8时(包含数组上的那个链表头)就会将链表转换为红黑树,以加快修改和查询效率。当然除了HashMap还 有很多地方都会用到红黑树,理解红黑树的原理还是比较重要的。 2.概念与由来 红黑树的本质是二叉树,二叉树...

    力扣刷题 | 二叉树

    文章目录总述基本概念二叉树性质二叉树遍历94 二叉树的中序遍历95 不同的二叉搜索树296 不同的二叉...二叉树的层次遍历2108 将有序数组转换为二叉搜索树109 有序链表转换二叉搜索树110 平衡二叉树111 二叉树的最小深度...

    二叉排序树与平衡二叉树的实现

    建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0” 补齐。 1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点...

    lrucacheleetcode-LeetCode:我的算法解决方案

    转换 整数 二叉搜索树 细绳 大批 数组整数 大批 大批 大批 细绳 二叉树 字符串比较 大批 LRU 二叉树 大批 细绳 链表 大批 大批 大批 细绳 二叉搜索树 二叉树 数组整数 数组整数 大批 大批 大批 大批 二叉树 链表 堆 ...

Global site tag (gtag.js) - Google Analytics