【二叉树算法】golang--构造二叉树

构造二叉树

  • 算法逻辑
    1. 从前序或后序数组中,找到根节点Val值,对应为第一个元素或最后一个元素
    2. 以根节点为切割点,分割中序数组、前/后序数组,注意先分割中序
    3. 递归方式,得到最终结果
  • 疑问:为什么要递归
    当将数组分为左子树Val和右子树Val值后,后面的步骤和之前是完全一致的。
    均为找到根节点,分割左右子树
    所以采用递归方式

通过前序遍历和中序遍历数组构造二叉树

// 通过前序遍历和中序遍历构造二叉树
func buildBinaryTreeII(preorder, inorder []int) *TreeNode {
	//
	if len(preorder) < 1 {
		return nil
	}
	nodeVal := preorder[0]
	if len(preorder) == 1 {
		return &TreeNode{Val: nodeVal}
	}
	root := &TreeNode{Val: nodeVal}
	//
	var index int

	for i := 0; i < len(inorder); i++{
		if inorder[i] == nodeVal {
			index = i
		}
	}
	//
	preLeft, preRight := preorder[1:index+1], preorder[index+1:]
	inLeft, inRight := inorder[:index], inorder[index+1:]
	//
	root.Left = buildBinaryTreeII(preLeft, inLeft)
	root.Right = buildBinaryTreeII(preRight, inRight)
	return root
}

通过中序遍历和后序遍历数组构造二叉树

/ 通过中序遍历和后序遍历数组构造二叉树
func buildBinaryTree(inorder, postorder []int) *TreeNode {
	// 终止
	if postorder == nil {
		return &TreeNode{}
	}
	// 从后序遍历拿到根节点
	rootVal := postorder[len(postorder)-1]
	root := &TreeNode{Val: rootVal}
	if len(postorder) == 1 {
		return root
	}
	// 分割左右子树
	var indexInorder int
	for i := 0; i < len(inorder); i++ {
		if inorder[i] == rootVal {
			indexInorder = i
		}
	}
	// 切割,左闭右开
	inLeft, inRight := inorder[:indexInorder], inorder[indexInorder+1:]
	postLeft, postRight := postorder[:len(inLeft)], postorder[len(inLeft):len(postorder)-1]
	root.Left = buildBinaryTree(inLeft, postLeft)
	root.Right = buildBinaryTree(inRight, postRight)
	return root
}

你可能感兴趣的:(golang,#,算法,golang,算法,leetcode)