`

中序遍历后序遍历 构建二叉树

 
阅读更多
/**
 * Definition for binary tree public class TreeNode { int val; TreeNode left;
 * TreeNode right; TreeNode(int x) { val = x; } }
 */
public class Solution {
	public TreeNode buildTree(int[] inorder, int[] postorder) {
		if (inorder == null || postorder == null || inorder.length != postorder.length)
			return null;
		int n = inorder.length;
		return buildTree(inorder, postorder, 0, n - 1, 0, n - 1);
	}

	// 根据中序遍历和后序遍历生成二叉树 dfs
	public TreeNode buildTree(int[] inorder, int[] postorder, int s1, int e1, int s2, int e2) {
		if (s1 > e1 || s2 > e2)
			return null;
		if (s2 == e2)
			return new TreeNode(postorder[s2]);

		// 后序遍历数组的最后一个是根节点
		int rootval = postorder[e2];
		TreeNode root = new TreeNode(rootval);
		int i;

		// 根据根节点在中序遍历数组里面得到左子树和右子数节点的数目
		for (i = s1; i <= e1; i++) {
			if (inorder[i] == rootval)
				break;
		}
		int leftlength = i - s1;
		int rightlength = e1 - i;

		// dfs递归
		root.left = buildTree(inorder, postorder, s1, i - 1, s2, s2 + leftlength - 1);
		root.right = buildTree(inorder, postorder, i + 1, e1, e2 - rightlength, e2 - 1);
		return root;
	}

	public int getlength(TreeNode root) {
		int depthLeft = 0;
		int depthRight = 0;
		int depth = 0;

		// 左子树的深度
		if (root.left != null) {
			depthLeft = getlength(root.left) + 1;
		}

		// 右子树的深度
		if (root.right != null) {
			depthRight = getlength(root.right) + 1;
		}
		if (depthLeft >= depthRight) {
			depth = depthLeft;
		} else {
			depth = depthRight;
		}
		return depth;
	}

	public static void main(String[] args) {
		String in = "T,b,H,V,h,3,o,g,P,W,F,L,u,A,f,G,r,m,1,x,J,7,w,e,0,i,Q,Y,n,Z,8,K,v,q,k,9,y,5,C,N,B,D,2,4,U,l,c,p,I,E,M,a,j,6,S,R,O,X,s,d,z,t";
		String po = "T,V,H,o,3,h,P,g,b,F,f,A,u,m,r,7,J,x,e,w,1,Y,Q,i,0,Z,n,G,L,K,y,9,k,q,v,N,D,B,C,5,4,c,l,U,2,8,E,I,R,S,6,j,d,s,X,O,a,M,p,W,t,z";
		String[] inChar = in.split(",");
		String[] poChar = po.split(",");
		System.out.println(inChar.length);
		System.out.println(poChar.length);

		int[] inI = new int[inChar.length];
		int[] poI = new int[poChar.length];
		for (int i = 0; i < inChar.length; i++) {
			inI[i] = inChar[i].toCharArray()[0];
			poI[i] = poChar[i].toCharArray()[0];
		}

		TreeNode tree = new Solution().buildTree(inI, poI);

		System.out.println(new Solution().getlength(tree));

		// for(int i=0;i<inChar.length;i++){
		// System.out.print(inI[i]+" ");
		// }
		// System.out.println();
		// for(int i=0;i<inChar.length;i++){
		// System.out.print(poI[i]+" ");
		// }

	}

}

// Definition for binary tree
class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	TreeNode(int x) {
		val = x;
	}

}

 

分享到:
评论

相关推荐

    C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法

    用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。

    实现先序,中序和后序遍历的二叉树遍历程序

    本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...

    二叉树先中序求后序 给出该二叉树的后序遍历结果;

    在二叉树的遍历中,有三种主要的方法:先序遍历、中序遍历和后序遍历,它们对于理解和构建二叉树至关重要。 1. 先序遍历(Preorder Traversal): 先序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树。用递归的方式表示...

    二叉树的遍历及通过前序中序遍历确定后序层序遍历

    根据给定的描述,程序允许用户输入二叉树的节点,通过0作为终止符构建二叉树,然后输出四种遍历的结果。这个过程通常涉及到递归或栈/队列的操作。 通过前序遍历和中序遍历可以唯一确定一棵二叉树。这是因为: - ...

    二叉树的基本操作,前序遍历,中序遍历,后序遍历,层序遍历

    本篇将详细介绍二叉树的基本操作,包括前序遍历、中序遍历、后序遍历以及层序遍历。 **1. 二叉树的基本操作** 二叉树的基本操作主要包括创建、插入、删除节点以及遍历等。创建二叉树时,需要指定根节点,之后通过...

    已知二叉树的前序和中序遍历,打印后序遍历

    这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -&gt; 左子树 -&gt; 右子树 **中序遍历**:左子树 -&gt; 根节点 -&gt; 右子树 **后序遍历**:左子树 -&gt; 右子...

    已知先序和中序遍历序列,求后序遍历序列.TXT

    根据给定文件的信息,...通过以上详细解析,我们可以了解到如何利用C语言实现基于前序遍历和中序遍历序列构建二叉树,并进一步求得后序遍历序列的过程。这种算法不仅适用于理论学习,也是实际编程中常用的技术之一。

    根据二叉树前序遍历和中序遍历的结果输出后序遍历(java)

    二叉树的遍历是对其进行操作和理解的关键部分,主要包括前序遍历、中序遍历和后序遍历。本话题将详细探讨如何根据给定的二叉树前序遍历和中序遍历的结果,利用Java来输出其后序遍历的序列。 前序遍历的顺序是:根...

    根据先序与中序遍历结果建立二叉树

    其中,二叉树的遍历是理解二叉树的基础之一,常见的遍历方法有先序遍历、中序遍历和后序遍历。 - **先序遍历**:访问顺序为“根—左—右”。 - **中序遍历**:访问顺序为“左—根—右”。 - **后序遍历**:访问顺序...

    中序遍历二叉树的递归算法

    二叉树有多种遍历方式,包括前序遍历、中序遍历和后序遍历。 #### 中序遍历定义 中序遍历是一种二叉树遍历方式,遵循以下顺序: 1. 遍历左子树。 2. 访问根节点。 3. 遍历右子树。 这种方式特别适合处理具有特定...

    二叉树的遍历,前序遍历 中序遍历 后序遍历

    本文将深入探讨二叉树的三种主要遍历方法:前序遍历、中序遍历和后序遍历。 **前序遍历(Preorder Traversal)** 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。这意味着我们首先访问根节点,然后递归地遍历左...

    课程设计报告数据结构二叉树遍历演示_二叉树中序遍历怎么看

    二叉树遍历主要包括前序遍历、中序遍历和后序遍历,这三种遍历方法在理解和应用二叉树时具有基础性的地位。 **1. 二叉树遍历概念** 二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常分为左子节点和...

    c++二叉树中序遍历

    通过这段代码,我们可以学习到如何在C++环境中定义二叉树结构,构建二叉树,以及实现中序遍历。这对于理解和处理涉及树形数据结构的问题非常有用。此外,代码还展示了如何使用模板类来处理不同类型的节点数据,增加...

    二叉树的中序遍历、哈夫曼编码-C语言编写的

    **中序遍历** 是二叉树遍历的三种基本方法之一,其余两种为前序遍历和后序遍历。中序遍历遵循以下规则:首先访问左子树,然后访问根结点,最后访问右子树。这个过程可以递归地应用于每一个子树,也可以通过栈来实现...

    C语言实现二叉树的中序遍历(递归)

    二叉树的遍历可以分为三种基本方式:前序遍历、中序遍历和后序遍历。本篇文章主要关注的是二叉树的中序遍历,尤其侧重于使用递归的方式实现。 #### 二、中序遍历的概念 中序遍历是一种常见的二叉树遍历方式,其...

    VC二叉树先序创建中序先序后序遍历

    首先,我们需要创建一个函数来构建二叉树,通常从给定的先序遍历序列开始。先序遍历的顺序是根节点-左子树-右子树。我们可以通过递归地插入元素来构建树。 **先序遍历:** 先序遍历的顺序是根节点-左子树-右子树。...

    有前序中序求后序遍历

    2. **构建二叉树**:利用前序和中序遍历结果来重建这棵树。 3. **后序遍历输出**:最后进行后序遍历,输出后序遍历序列。 #### 构建二叉树算法 为了实现这一目标,我们需要定义一个二叉树结构体,并设计一个递归...

    数据结构实验报告8-树-求二叉树先序、中序、后序遍历次序的第k个访问结点-实验内容与要求.docx

    - 使用先序遍历法递归地构建二叉树。具体步骤如下: - 首先读取一个字符作为当前节点的数据。 - 如果读取到的字符为`#`,则表示该位置为空节点,返回`NULL`。 - 否则创建一个新的节点,并将其数据设置为读取的...

    二叉树的前序中序后序遍历代码

    根据给定的文件信息,本文将详细介绍二叉树的基本概念及其前序、中序和后序遍历的实现原理,并对代码进行分析。 ### 一、二叉树基础概念 二叉树是一种特殊的非线性数据结构,它具有以下特点: - 每个节点最多有两...

    建一棵二叉树,并分别用先序和中序遍历二叉树

    本话题将深入探讨如何构建二叉树以及如何使用先序和中序遍历的方法。 首先,构建二叉树的过程通常涉及以下几个步骤: 1. **定义节点结构**:在编程中,我们需要定义一个结构来表示二叉树的节点,通常包括数据部分...

Global site tag (gtag.js) - Google Analytics