• Construct Binary Tree from Preorder and Inorder Traversal


    问题描述

    Given preorder and inorder traversal of a tree, construct the binary tree.

    解决思路

    首先确定根节点,然后确定左右子树的节点数目。依次递归即可。

    假设输入的序列均合法。

    程序

    public class BuildTreeFromPreorderAndInorder {
    	public TreeNode buildTree(int[] preorder, int[] inorder) {
    		if (preorder == null || inorder == null || preorder.length == 0
    				|| preorder.length != inorder.length) {
    			return null;
    		}
    		int len = preorder.length;
    		TreeNode root = buildHelper(preorder, 0, len - 1, inorder, 0, len - 1);
    		return root;
    	}
    
    	private TreeNode buildHelper(int[] preorder, int pre_start, int pre_end,
    			int[] inorder, int in_start, int in_end) {
    		// bound
    		if (pre_start > pre_end || in_start > in_end) {
    			return null;
    		}
    
    		int rootVal = preorder[pre_start];
    		TreeNode root = new TreeNode(rootVal);
    		// find root-val in inorder list
    		int i = 0;
    		for (; i <= in_end; i++) {
    			if (inorder[i] == rootVal) {
    				break;
    			}
    		}
    
    		int leftLen = i - in_start;
    		root.left = buildHelper(preorder, pre_start + 1, pre_start + leftLen,
    				inorder, in_start, i - 1);
    		root.right = buildHelper(preorder, pre_start + leftLen + 1, pre_end,
    				inorder, i + 1, in_end);
    
    		return root;
    	}
    }
    

    Follow up

    如果给定的是中序和后序遍历序列,如何构建二叉树?

    解决思路是类似的。

    程序

    public class BuildTreeFromInorderAndPostorder {
    	public TreeNode buildTree(int[] inorder, int[] postorder) {
    		if (inorder == null || postorder == null || inorder.length == 0
    				|| inorder.length != postorder.length) {
    			return null;
    		}
    		int len = inorder.length;
    		TreeNode root = buildHelper(inorder, 0, len - 1, postorder, 0, len-1);
    		return root;
    	}
    
    	private TreeNode buildHelper(int[] inorder, int in_start, int in_end, int[] postorder,
    			int post_start, int post_end) {
    		if (in_start > in_end || post_start > post_end) {
    			return null;
    		}
    		
    		int rootVal = postorder[post_end];
    		TreeNode root = new TreeNode(rootVal);
    		
    		int i = in_start;
    		for (; i <= in_end; i++) {
    			if (inorder[i] == rootVal) {
    				break;
    			}
    		}
    		
    		int leftLen = i - in_start;
    		root.left = buildHelper(inorder, in_start, i-1, postorder, post_start, post_start+leftLen-1);
    		root.right = buildHelper(inorder, i+1, in_end, postorder, post_start+leftLen, post_end - 1);
    		
    		return root;
    	}
    }
    

      

  • 相关阅读:
    2021杭电多校4 1003/HDU 6987 Cycle Binary
    2021牛客多校5 G/nowcoder 11256 G Greater Integer, Better LCM
    2021牛客多校4 G/nowcoder 11255 G Product
    2021牛客多校4 H/nowcoder 11255 H Convolution
    FFT/NTT字符串模糊匹配
    Codeforces Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
    2021杭电多校2 1006/HDU 6966 I love sequences
    2021牛客多校3 E/nowcoder 11254 E Math
    2021杭电多校1 1011/HDU 6960 Necklace of Beads
    linux操作系统使用小技巧,把程序和数据彻底分开
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4656412.html
Copyright © 2020-2023  润新知