【数据结构与算法】重建二叉树

只能根据前序中序或者中序后序重建二叉树,不可能根据前序和后序重建,因为需要中序去划分左右子树。

  • 代码实现

/**
 * 源码名称:ConstructBT.java
 * 日期:2014-09-05
 * 程序功能:重建二叉树(前序中序)
 * 版权:[email protected]
 * 作者:A2BGeek
 */
public class ConstructBT {
	class Node<T> {
		T mValue;
		Node<T> mLeft;
		Node<T> mRight;

		public Node(T value, Node<T> left, Node<T> right) {
			mValue = value;
			mLeft = left;
			mRight = right;
		}
	}

	public Node<Character> buildBT(String pre, String mid) {
		Node<Character> root = null;
		String lpre, rpre, lmid, rmid;
		int pos = 0;
		if (pre.length() == 0 || mid.length() == 0) {
			return null;
		} else {
			root = new Node<Character>(pre.charAt(0), null, null);
			while (mid.charAt(pos) != root.mValue) {
				pos++;
			}
			// recursive left
			lpre = pre.substring(1, pos + 1);
			lmid = mid.substring(0, pos);
			root.mLeft = buildBT(lpre, lmid);
			// recursive right
			rpre = pre.substring(pos + 1, pre.length());
			rmid = mid.substring(pos + 1, mid.length());
			root.mRight = buildBT(rpre, rmid);
		}
		return root;
	}

	public void postIterate(Node<Character> root) {
		if (root == null) {
			return;
		} else {
			postIterate(root.mLeft);
			postIterate(root.mRight);
			System.out.print(root.mValue + " ");
		}
	}

	public static void main(String[] args) {
		ConstructBT bt = new ConstructBT();
		Node<Character> root = bt.buildBT("12473568", "47215386");
		bt.postIterate(root);
	}
}
时间: 2024-10-11 00:09:23

【数据结构与算法】重建二叉树的相关文章

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构与算法(二叉树)

二叉树的存储结构 二叉树的存储可分为两种:顺序存储结构和链式存储结构. 1.      顺序存储结构 把一个满二叉树自上而下.从左到右顺序编号,依次存放在数组内,可得到图6.8(a)所示的结果.设满二叉树结点在数组中的索引号为i,那么有如下性质. (1) 如果i = 0,此结点为根结点,无双亲. (2) 如果i > 0,则其双亲结点为(i -1) / 2 .(注意,这里的除法是整除,结果中的小数部分会被舍弃.) (3) 结点i的左孩子为2i + 1,右孩子为2i + 2. (4) 如果i >

数据结构与算法:二叉树

二叉树是一种非常常见并且实用的数据结构,它结合了有序数组与链表的优点.在二叉树中查找数据与在数组中查找数据一样快,在二叉树中添加.删除数据的速度也和在链表中一样高效,所以有关二叉树的相关技术一直是程序员面试笔试中必考的知识点. 基础知识 基本概念 性质 有关二叉树的例题 题目 解析 递归实现二叉树的遍历 已知先序遍历和中序遍历如何求后序遍历 引申已知中序遍历和后序遍历求先序遍历 非递归实现二叉树的后序遍历 如何使用非递归方法实现二叉树的先序遍历与中序遍历 使用非递归算法求二叉树的深度 霍夫曼编解

【数据结构与算法】二叉树递归与非递归遍历(附完整源码)(转)

转自:http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现. 一.三种遍历方式的递

【数据结构与算法】二叉树的Java实现及特点总结

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树.二叉排序树.二叉搜索

数据结构与算法-树-二叉树与郝夫曼树

二叉树的遍历 二叉树的遍历指的是从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 二叉树的遍历方法: 前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树. 1 void PreOrderTraverse(BiTree T) 2 { 3 if(T == NULL) 4 return; 5 printf("%c",T->data);/*显示结点数据,可以更改为其他对结点操作*/ 6 PreOr

【数据结构与算法】二叉树——哈夫曼编码

最近有很多的小朋友问我什么是哈夫曼编码,哈夫曼编码是一种可变字长的编码,那什么是可变字长呢?就是一句话里的每一个字符(ASCII码)它的位数(长度)是不一样的.就像我们一句话(AAAACCCCCDDDDBBE)有A,B,C,D,E五种字符,在这里我们可以用01表示A字符,用001表示B字符,用11表示C字符,用10表示D字符,用000表示E字符.如下图: 既然知道了哈夫曼编码是什么了,那又有好奇的小朋友又会问了:那么哈夫曼编码是按照什么原理生成的呢? 在这里我就要告诉大家,哈夫曼编码是根据哈夫曼

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-10二叉树的基本概念

二叉树节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data) { this.data = data; } } 二叉树类: /* * 二叉树类 */ public class Tree { //根节点 priv

【数据结构与算法】二叉树深度遍历(递归)

二叉树的深度遍历用递归的话就没有什么好说的了. 代码实现 /** * 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:[email protected] * 作者:A2BGeek */ public class TreeIteratorRecursion { class TreeNode<T> { private T mNodeData; private TreeNode<T> mLeftChi