由前序遍历和中序遍历的到二叉树

本文介绍了一种根据前序遍历和中序遍历序列构造二叉树的方法。通过递归方式,找到根节点,并划分左子树和右子树的范围,递归构造左右子树,最终完成整棵二叉树的构建。

题目:牛客网

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
   public static TreeNode buildTree(int[] preorder, int[] inorder) {
		if(inorder.length==0 || preorder.length == 0)
            return null;
		return solve(preorder , 0, preorder.length-1, inorder, 0, inorder.length-1 );
	}
	public static TreeNode solve(int[] preorder,int pre_start, int pre_end, int[] inorder, int in_start, int in_end) {
		if(in_start>in_end||pre_start>pre_end)
            return null;
        TreeNode root = new TreeNode(preorder[pre_start]);
        int index=0;
        for(int i=0;i<=in_end;i++){
            if(inorder[i]==preorder[pre_start]){
                index=i;
            }
        }
        root.left = solve(preorder , pre_start+1, pre_start+index-in_start, inorder, in_start, index-1 );
        root.right = solve(preorder , pre_start+index-in_start+1, pre_end , inorder, index+1, in_end);
        return root;
    }
}

 

通过二叉树前序遍历序遍历结果求后序遍历结果,可利用前序遍历序遍历的特点,结合递归的方法来实现。 前序遍历的顺是先访问根节点,然后递归遍历左子树,最后递归遍历右子树;中序遍历的顺是先递归遍历左子树,然后访问根节点,最后递归遍历右子树。因此,前序遍历的第一个元素就是二叉树的根节点,在中序遍历中找到该根节点的位置,其左边的元素就是左子树的中序遍历结果,右边的元素就是右子树的中序遍历结果。根据左子树右子树的节点数量,又可以从前序遍历中划分出左子树右子树的前序遍历结果。然后对左子树右子树分别递归地进行上述操作,直到子树为空。 以下是实现该功能的 Java 代码示例: ```java class Solution { public void postOrder(int[] pre, int[] mid, int preStart, int preEnd, int midStart, int midEnd) { if (preStart > preEnd || midStart > midEnd) { return; } // 前序遍历的第一个元素是根节点 int rootVal = pre[preStart]; // 在中序遍历中找到根节点的位置 int rootIndexInMid = midStart; while (mid[rootIndexInMid] != rootVal) { rootIndexInMid++; } // 计算左子树的节点数量 int leftSubtreeSize = rootIndexInMid - midStart; // 递归遍历左子树 postOrder(pre, mid, preStart + 1, preStart + leftSubtreeSize, midStart, rootIndexInMid - 1); // 递归遍历右子树 postOrder(pre, mid, preStart + leftSubtreeSize + 1, preEnd, rootIndexInMid + 1, midEnd); // 输出根节点 System.out.print(rootVal + " "); } public static void main(String[] args) { Solution solution = new Solution(); int[] pre = {1, 2, 4, 5, 3, 6, 7}; int[] mid = {4, 2, 5, 1, 6, 3, 7}; solution.postOrder(pre, mid, 0, pre.length - 1, 0, mid.length - 1); } } ``` 上述代码中,`postOrder` 方法接收前序遍历数组 `pre`、中序遍历数组 `mid`,以及前序遍历序遍历的起始结束索引。在方法内部,首先找到根节点,然后在中序遍历中确定根节点的位置,计算左子树的节点数量,接着递归地对左子树右子树进行处理,最后输出根节点的值,从而实现后序遍历的结果输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值