根据前中后中任意两种的任意组合重构二叉树-Java实现

以下的代码均通过力扣的测试,仅供初学者进行参考,全是一种模版形式,以下的示例操作的也是同一棵树。

  1. 根据前序和后序遍历构造二叉树
  2. 从前序与中序遍历序列构造二叉树
  3. 从中序与后序遍历序列构造二叉树
    3
   / \
  9  20
    /  \
   15   7

1 根据前序和后序遍历构造二叉树
题目描述:返回与给定的前序和后序遍历匹配的任何二叉树。
pre 和 post 遍历中的值是不同的正整数。
示例:
输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]

class Solution {
    public TreeNode constructFromPrePost(int[] pre, int[] post) {return helper(pre,0,pre.length-1,post,0,post.length-1);
    }
	private TreeNode helper(int[] pre, int startPre, int endPre, int[] post, int startPost, int endPost) {
		if(startPre>endPre || startPost>endPost) {
			return null;
		}
		TreeNode root=new TreeNode(pre[startPre]);
		if(startPre==endPre) {
			return root;
		}
		int start=0;
		for(;start<endPost;start++) {
			if(pre[startPre+1]==post[start]) {
				break;
			}
		}
		root.left=helper(pre,startPre+1,startPre+1+start-startPost,post,startPost,start);
		root.right=helper(pre,startPre+2+start-startPost,endPre,post,start+1,endPost-1);
		return root;
	}
}

2. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
return helper2(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
    }
	private TreeNode helper2(int[] preorder, int startPre, int endPre, int[] inorder, int startIn, int endIn) {
		if(startPre>endPre || startIn>endIn) {
			return null;
		}
		TreeNode root=new TreeNode(preorder[startPre]);
		if(startPre==endPre) {
			return root;
		}
		int start=0;
		for(;start<endIn;start++) {
			if(preorder[startPre]==inorder[start]) {
				break;
			}
		}
		root.left=helper2(preorder,startPre+1,startPre+start-startIn,inorder,startIn,start-1);
		root.right=helper2(preorder,startPre+start-startIn+1,endPre,inorder,start+1,endIn);
		return root;
	}
}

3. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
         if(inorder.length == 0) return null;
	        return rebuildBT(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
		 }
		private TreeNode rebuildBT(int[] inOrder, int startIn, int endIn, int[] postorder, int startPost, int endPost){
	        if(endIn < startIn || endPost < startPost) return null;
	        TreeNode root = new TreeNode(postorder[endPost]);
	        int start = startIn;
	        while(inOrder[start] != postorder[endPost]){
	            start++;
	        }
	        root.left = rebuildBT(inOrder, startIn, start - 1, postorder ,startPost, start + startPost - startIn - 1);
	        root.right= rebuildBT(inOrder, start + 1, endIn, postorder, start + startPost - startIn, endPost - 1);
	        return root;
	    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值