zoukankan      html  css  js  c++  java
  • 0106105从中序与后序遍历序列中构造二叉树 Marathon

    根据一棵树的中序遍历与后序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]

    返回如下的二叉树:

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal

    python

    # 0106.中序后序构造二叉树
    class Solution:
        def buildTree(self, inorder: [int], postorder: [int]) -> TreeNode:
            # 1.递归终止条件
            if not postorder:
                return None
            # 2.后序最后元素为当前中间节点
            rootVal = postorder[-1]
            root = TreeNode(rootVal)
    
            # 3.找切割点
            sepIndex = inorder.index(rootVal)
    
            # 4.切割inorder数组,得到inorder的左右半边
            inorderLeft = inorder[:sepIndex]
            inorderRight = inorder[sepIndex+1:]
    
            # 5.切割postorder数组,得到postorder数组的左右半边
            postorderLeft = postorder[:len(inorderLeft)]
            postorderRight = postorder[len(inorderLeft):len(postorder)-1]
    
            # 6.递归左右半边
            root.left = self.buildTree(inorderLeft, postorderLeft)
            root.right = self.buildTree(inorderRight, postorderRight)
    
            return root
    
    # 0105.前序中序构造二叉树
    class Solution:
        def buildTree(self, preorder: [int], inorder: [int]) -> TreeNode:
            # 1.递归终止条件
            if not preorder:
                return None
    
            # 2.前序第一个为当前中间节点
            rootVal = preorder[0]
            root = TreeNode(rootVal)
    
            # 3.找切割点
            sepIndex = inorder.index(rootVal)
    
            # 4.切割inorder数组,得左右半边
            inorderLeft = inorder[:sepIndex]
            inorderRight = inorder[sepIndex+1:]
    
            # 5.切割preorder数组,得左右半边
            pretorderLeft = preorder[1:1+len(inorderLeft)]
            pretorderRight = preorder[1+len(inorderLeft):]
    
            # 6.递归
            root.left = self.buildTree(pretorderLeft, inorderLeft)
            root.right = self.buildTree(pretorderRight, inorderRight)
    
            return root
    
    

    golang

    package binaryTree
    
    // 0106.中后序构造二叉树
    func buildTree1(inorder []int, postorder []int) *TreeNode {
    	// 1.递归终止条件
    	if len(inorder) < 1 || len(postorder) < 1 {
    		return nil
    	}
    
    	// 2.找到当前中间节点
    	nodeVal := postorder[len(postorder)-1]
    
    	// 3.找到切割点
    	left := findRootIndex(inorder, nodeVal)
    
    	// 4.构造root
    	root := &TreeNode{Val: nodeVal,
    		Left: buildTree1(inorder[:left], postorder[:left]),
    		Right: buildTree1(inorder[left+1:], postorder[left:len(postorder)-1])}
    	return root
    }
    
    func findRootIndex(inorder []int, targetVal int) int {
    	for i,v := range inorder {
    		if targetVal == v {
    			return i
    		}
    	}
    	return -1
    }
    
    // 105.前中序构造二叉树
    func buildTree2(preorder []int, inorder []int) *TreeNode {
    	// 1.递归终止条件
    	if len(preorder) < 1 || len(inorder) < 1 {
    		return nil
    	}
    
    	// 2.找当前中间点值
    	nodeVal := preorder[0]
    
    	// 3.找切割位置
    	left := findRootIndex(inorder, nodeVal)
    
    	// 4.构造root
    	root := &TreeNode{
    		Val: nodeVal,
    		Left: buildTree2(preorder[1:left+1], inorder[:left]),
    		Right: buildTree2(preorder[left+1:], inorder[left+1:])
    	}
    	return root
    }
    
    
    
  • 相关阅读:
    Vue cmd命令操作
    迭代器和生成器
    10-外键的变种 三种关系
    09-完整性约束
    08-数据类型(2)
    07-数据类型
    06-表的操作
    05-库的操作
    04-基本的mysql语句
    03-MySql安装和基本管理
  • 原文地址:https://www.cnblogs.com/davis12/p/15564102.html
Copyright © 2011-2022 走看看