LeetCode题目:106. 从中序与后序遍历序列构造二叉树

题目

题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
题目解析:利用中序和后序遍历构造二叉树,用暴力解法

  1. 中序遍历为:左根右
  2. 后序遍历为:左右根
  3. 后序遍历的最后一个值都是根
  4. 根据后序遍历找到的根可以在中序遍历的数组中寻找到左子树的范围和右子树的范围
  5. 依次递归则可以构造这棵树
    在这里插入图片描述

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    	 int[] inorder;
	 int[] postorder;
	 public TreeNode buildTree(int[] inorder, int[] postorder) {
		 this.inorder = inorder;
		 this.postorder = postorder;
        if(inorder.length==0)
            return null;
		return go(0,inorder.length-1,0,postorder.length-1);

	 }
	private TreeNode go(int mf, int ml, int pf, int pl) {
        //如果左后范围的值一致,则只有一个元素,直接返回结点
        if(mf==ml)
            return (new TreeNode(inorder[mf]));
        if(pf==pl)
            return(new TreeNode(postorder[pl]));
		//通过后序遍历获得根节点
		TreeNode root = new TreeNode(postorder[pl]);
		//创建变量记录根节点在中序遍历的索引
		int r = mf;
		//遍历查询根节点在中序遍历的索引
		for(int i=mf;i<=ml;i++) {
			if(inorder[i]==root.val)
				r=i;
		}
		//中序遍历左子树范围
		int mlf=mf;
		int mll=r-1;
		//中序遍历右子树范围
		int mrf=r+1;
		int mrl=ml;
		//后序遍历左子树范围
		int plf=pf;
		int pll=pf+(r-mf)-1;
		//后序遍历右子树范围
		int prf=pf+(r-mf);
		int prl=pl-1;
		//左子树递归,要确定边界
        if(mll>=mf){
		root.left=go(mlf,mll,plf,pll);
        }
		//右子树递归,要确定边界
        if(mrf<=ml){
		root.right=go(mrf,mrl,prf,prl);
        }
		return root;
	}
}

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读