根据先序和中序构建二叉树(java)后序输出

先序序列:   1,2,4,8,5,3,6,7

中序序列:   8,4,2,5,1,6,3,7

//节点类

/**
 *
 */
package Tree;

/**
 * @author 邢兵
 * @data
 * @description
 */
public class Node {
	public Object data;
	public Node left;
	public Node right;

	//创建一个空节点
	public Node(){
		this(null);
	}
	//创建一个没有孩子的节点
	public Node(Object data){
		this(data, null, null);
	}
	//创建一个 带有孩子的节点
	public Node(Object data, Node left, Node right){
		this.data = data;
		this.left = left;
		this.right = right;
	}
}
/**
 *
 */
package Tree;

/**
 * @author 邢兵
 * @data
 * @description
 */
public class BiTree {
	public static int index=0;
	public static void main(String[] args) {
		int pre[]={1,2,4,8,5,3,6,7};//先序排列
		int in[] = {8,4,2,5,1,6,3,7};//中序排列
		Node root = build(0, pre.length-1, pre, in);
		post(root);
	}
	public static Node build(int left, int right, int preorder[], int inorder[]){
		Node root = null;
		if(left<=right){
			int in = left;
			for(int i=in;i<=right;i++){
				if(inorder[i]==preorder[index]){
					in = i;
					break;
				}

			}
			root = new Node(preorder[index]);
			index++;
			root.left = build(left, in-1, preorder, inorder);
			root.right = build(in+1, right, preorder, inorder);

		}
		return root;
	}
	public static void post(Node root){
		if(root!=null){
			post(root.left);
			post(root.right);
			System.out.print(root.data);
		}
	}
}

  

原文地址:https://www.cnblogs.com/xuesujun/p/12238955.html

时间: 2024-11-08 23:25:19

根据先序和中序构建二叉树(java)后序输出的相关文章

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

Binary Tree Postorder Traversal 二叉树的后序遍历

地址:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题意就是完成二叉树的后序遍历,我们知道如果使用递归进行二叉树后序遍历将是非常简单的事情. public class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer > ans = new ArrayList<>(); Tr

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

[LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 经典题目,求二叉树的后序遍历的非递归方法,跟前序,中序,层序一样都需要用到栈,后续的顺序

判断排序二叉树的后序遍历是否正确(对递归算的总结)

是 #include <iostream> using namespace std; //排序二叉树的性质 /* *.终止条件:1.开始>=结尾返回真 *. 2.s >= e 因为不出现问题的话,一定能到达 s>=e的情况.知道到达了s >= e即为真 *. 1.最后一个节点是root 2.在root之前的节点 连续的大于root的是其右子树, 再之前连续小于root的是其左子树 3.递归调用 */ bool treehelper(int a[], int s, int

树——二叉树的后序遍历(非递归)

思路: 二叉树的后序遍历非递归方法与前序,中序不同,稍微麻烦一些. 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点cur,先将其入栈.如果cur不存在左孩子和右孩子,则可以直接访问它:或者cur存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将cur的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. 代码如下: /** * Definition for