剑指 Offer 07. 重建二叉树、16. 数值的整数次方、33. 二叉搜索树的后序遍历序列
题目描述:
[07]
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
[16]
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
[33]
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
考察重点:
第07题先通过先序数组确定中间节点A,再进入中序数组找到A,将中序数组划分为左右两部分(即左右子树),依次递归。
第16题以2的倍数累加乘积,即每次以tt=1,2,4…;nowN=1+2+4+8…个x相乘,当nowN +tt > n时,n-=nowN,nowN置0,tt置1,重新开始累加。
第33题后序遍历数组,中间节点在数组末尾,由于是二叉搜索树,因此每次只需从首位开始,查找连续的小于末尾元素的子数组作为左子树,查找连续的大于末尾元素的子数组作为右子树。如果左右子树元素之和刚好等于当前数组-1(即左右子树元素之和+根节点==当前数组元素之和),说明当前数组符合条件,继续遍历左右子树。
第07题
func dfs(preorder []int, inorder []int)*TreeNode {i := 0for ;i < len(inorder);i ++{if preorder[0] == inorder[i]{break}}root := &TreeNode{Val: preorder[0], Left:nil, Right:nil}leftLen := len(inorder[0:i])rightLen := len(inorder[i+1:])if leftLen == 0{root.Left = nil}else{root.Left = dfs(preorder[1:leftLen+1], inorder[0:i])}if rightLen == 0{root.Right = nil}else{root.Right = dfs(preorder[leftLen+1:], inorder[i+1:])}return root
}
func buildTree(preorder []int, inorder []int) *TreeNode {if len(preorder) == 0 || len(inorder) == 0{return nil}return dfs(preorder, inorder)
}
第16题
func myPow(x float64, n int) float64 {res := 1.0mark := trueif n > 0{mark = falsen = -n}for n != 0{nowN := 0tt := 1nowX := xfor nowN - tt >= n{res = res * nowXnowX *= nowXnowN -= tttt *= 2}n -= nowN}if mark{res = 1 / res}return res
}
第33题
func dfs(postorder []int)bool{ point := 0oLen := len(postorder) - 1if oLen <= -1{return true}for ;point < oLen && postorder[point] < postorder[oLen];point ++{}recLeft := point for ;point < oLen && postorder[point] > postorder[oLen];point ++{}return point == oLen && dfs(postorder[0:recLeft]) && dfs(postorder[recLeft:oLen])
}func verifyPostorder(postorder []int) bool {return dfs(postorder);
}