从前序与中序遍历序列构造二叉树——递归

69 阅读1分钟

image.png

代码

  1. preorder [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
  2. inorder [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
  3. 通过preorder和inorder得到当前数的根节点,我们建立当前的根节点
  4. 当前的根节点的Left则可以通过buildTree的下一层得到,
  5. 同理Right也一样
  6. 最后返回当前的root节点
  7. 至于下一层的buildTree的参数则是左子树的前序和左子树的中序
  8. 最后也就是最深处, len(preorder) == 0 ,则说明当前是遍历的上一层root节点的nil节点,直接return nil就可以了
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func buildTree(preorder []int, inorder []int) *TreeNode {
    if len(preorder) == 0 {
        return nil
    }
    root := &TreeNode{preorder[0],nil,nil}
    i := 0
    for i++ {
        if inorder[i] == preorder[0] {
            break
        }
    }
    root.Left = buildTree(preorder[1:i+1],inorder[:i])
    root.Right = buildTree(preorder[i+1:],inorder[i+1:])
    return root
}