leetcode106-根据中序和后续遍历构建二叉树

根据中序和后续遍历构建二叉树

  • 中序遍历:左子树,根节点,右子树
  • 后序遍历: 左子树,右子树,根节点
  • 后序遍历的最后一个元素即根节点的值
  • 根节点在中序遍历中的索引index等于左子树长度

代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func buildTree(inorder []int, postorder []int) *TreeNode {
	if len(inorder) == 0{
		return nil
	}
    l := len(postorder)-1			// root节点所在位置的index
	rootVal := postorder[l]			// 获得root节点
	root := &TreeNode{Val: rootVal} // 构建根节点
	// root := new(TreeNode)
	// root.Val = rootVal
	i :=0							// 查找根节点在中序遍历中的位置index
	for ;i<len(inorder);i++{
		if inorder[i] == rootVal{
			break
		}
	}
	// i可以理解为是左子树的长度
	// 在中序遍历中,inorder[:i]即左子树的元素; 在后序遍历中,postorder[:i]也为左子树的元素
	root.Left = buildTree(inorder[:i],postorder[:i])
	// 在中序遍历中,inorder[i+1:]为右子树的元素,i为根节点,i+1即把根节点剔除 
	// 在后序遍历中,postorder[i:l]为右子树的元素,切片截取为左闭右开,此处获取不到l对应的根节点原素
	root.Right = buildTree(inorder[i+1:],postorder[i:l])
	return root
}
posted @ 2020-08-09 17:17  litchi99  阅读(112)  评论(0编辑  收藏  举报