/** * 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++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...
在二叉树的遍历中,有三种主要的方法:先序遍历、中序遍历和后序遍历,它们对于理解和构建二叉树至关重要。 1. 先序遍历(Preorder Traversal): 先序遍历的顺序是根节点 -> 左子树 -> 右子树。用递归的方式表示...
根据给定的描述,程序允许用户输入二叉树的节点,通过0作为终止符构建二叉树,然后输出四种遍历的结果。这个过程通常涉及到递归或栈/队列的操作。 通过前序遍历和中序遍历可以唯一确定一棵二叉树。这是因为: - ...
本篇将详细介绍二叉树的基本操作,包括前序遍历、中序遍历、后序遍历以及层序遍历。 **1. 二叉树的基本操作** 二叉树的基本操作主要包括创建、插入、删除节点以及遍历等。创建二叉树时,需要指定根节点,之后通过...
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
根据给定文件的信息,...通过以上详细解析,我们可以了解到如何利用C语言实现基于前序遍历和中序遍历序列构建二叉树,并进一步求得后序遍历序列的过程。这种算法不仅适用于理论学习,也是实际编程中常用的技术之一。
二叉树的遍历是对其进行操作和理解的关键部分,主要包括前序遍历、中序遍历和后序遍历。本话题将详细探讨如何根据给定的二叉树前序遍历和中序遍历的结果,利用Java来输出其后序遍历的序列。 前序遍历的顺序是:根...
其中,二叉树的遍历是理解二叉树的基础之一,常见的遍历方法有先序遍历、中序遍历和后序遍历。 - **先序遍历**:访问顺序为“根—左—右”。 - **中序遍历**:访问顺序为“左—根—右”。 - **后序遍历**:访问顺序...
二叉树有多种遍历方式,包括前序遍历、中序遍历和后序遍历。 #### 中序遍历定义 中序遍历是一种二叉树遍历方式,遵循以下顺序: 1. 遍历左子树。 2. 访问根节点。 3. 遍历右子树。 这种方式特别适合处理具有特定...
本文将深入探讨二叉树的三种主要遍历方法:前序遍历、中序遍历和后序遍历。 **前序遍历(Preorder Traversal)** 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。这意味着我们首先访问根节点,然后递归地遍历左...
二叉树遍历主要包括前序遍历、中序遍历和后序遍历,这三种遍历方法在理解和应用二叉树时具有基础性的地位。 **1. 二叉树遍历概念** 二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常分为左子节点和...
通过这段代码,我们可以学习到如何在C++环境中定义二叉树结构,构建二叉树,以及实现中序遍历。这对于理解和处理涉及树形数据结构的问题非常有用。此外,代码还展示了如何使用模板类来处理不同类型的节点数据,增加...
**中序遍历** 是二叉树遍历的三种基本方法之一,其余两种为前序遍历和后序遍历。中序遍历遵循以下规则:首先访问左子树,然后访问根结点,最后访问右子树。这个过程可以递归地应用于每一个子树,也可以通过栈来实现...
二叉树的遍历可以分为三种基本方式:前序遍历、中序遍历和后序遍历。本篇文章主要关注的是二叉树的中序遍历,尤其侧重于使用递归的方式实现。 #### 二、中序遍历的概念 中序遍历是一种常见的二叉树遍历方式,其...
首先,我们需要创建一个函数来构建二叉树,通常从给定的先序遍历序列开始。先序遍历的顺序是根节点-左子树-右子树。我们可以通过递归地插入元素来构建树。 **先序遍历:** 先序遍历的顺序是根节点-左子树-右子树。...
2. **构建二叉树**:利用前序和中序遍历结果来重建这棵树。 3. **后序遍历输出**:最后进行后序遍历,输出后序遍历序列。 #### 构建二叉树算法 为了实现这一目标,我们需要定义一个二叉树结构体,并设计一个递归...
- 使用先序遍历法递归地构建二叉树。具体步骤如下: - 首先读取一个字符作为当前节点的数据。 - 如果读取到的字符为`#`,则表示该位置为空节点,返回`NULL`。 - 否则创建一个新的节点,并将其数据设置为读取的...
根据给定的文件信息,本文将详细介绍二叉树的基本概念及其前序、中序和后序遍历的实现原理,并对代码进行分析。 ### 一、二叉树基础概念 二叉树是一种特殊的非线性数据结构,它具有以下特点: - 每个节点最多有两...
本话题将深入探讨如何构建二叉树以及如何使用先序和中序遍历的方法。 首先,构建二叉树的过程通常涉及以下几个步骤: 1. **定义节点结构**:在编程中,我们需要定义一个结构来表示二叉树的节点,通常包括数据部分...