-
654最大二叉树
- 代码随想录 (programmercarl.com)
-
第一印象
- 遍历数组得到最大值构建当前结点,然后再将数组拆分到子树。利用递归构建二叉树。
-
解题代码
- 递归的终止逻辑来自于数组拆分后是否还有元素
-
func constructMaximumBinaryTree(nums []int) *TreeNode {
if len(nums) == 0 {
return nil
}
index := findMax(nums)
root := &TreeNode {
Val: nums[index],
Left: constructMaximumBinaryTree(nums[:index]),
Right: constructMaximumBinaryTree(nums[index+1:]),
}
return root
}
func findMax(nums []int) (index int) {
for i, v := range nums {
if nums[index] < v {
index = i
}
}
return
}
- 要注意左闭右开的逻辑
- 要注意建立新结点时使用&取址
-
617合并二叉树
- 代码随想录 (programmercarl.com)
-
讲解观后感
- 同时传入两个树的根节点,前序递归遍历。终止方法是当
root1为空时返回root2,当root2为空时返回root1。每次传入两树相同位置的结点。
-
解题代码
- 直接使用两树原本的结点进行计算和连接操作。
-
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1 == nil {
return root2
}
if root2 == nil {
return root1
}
root1.Val += root2.Val
root1.Left = mergeTrees(root1.Left, root2.Left)
root1.Right = mergeTrees(root1.Right, root2.Right)
return root1
}
- 迭代
-
// 迭代版本
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
queue := make([]*TreeNode,0)
if root1 == nil{
return root2
}
if root2 == nil{
return root1
}
queue = append(queue,root1)
queue = append(queue,root2)
for size := len(queue)
node1 := queue[0]
queue = queue[1:]
node2 := queue[0]
queue = queue[1:]
node1.Val += node2.Val
// 左子树都不为空
if node1.Left != nil && node2.Left != nil {
queue = append(queue,node1.Left)
queue = append(queue,node2.Left)
}
// 右子树都不为空
if node1.Right !=nil && node2.Right !=nil {
queue = append(queue, node1.Right)
queue = append(queue, node2.Right)
}
// 树 1 的左子树为 nil,直接接上树 2 的左子树
if node1.Left == nil {
node1.Left = node2.Left
}
// 树 1 的右子树为 nil,直接接上树 2 的右子树
if node1.Right == nil {
node1.Right = node2.Right
}
}
return root1
}
-
700二叉搜索树中的搜索
- 代码随想录 (programmercarl.com)
-
第一印象
- 这题考查对于二叉搜索树特性的理解。使用迭代法每次根据目标值与当前结点的比较关系向下查找即可。
-
讲解观后感
- 递归查找也可以,利用前序遍历。
-
解题代码
- 迭代法
-
func searchBST(root *TreeNode, val int) *TreeNode {
for root != nil {
if root.Val > val {
root = root.Left
} else if root.Val < val {
root = root.Right
} else {
return root
}
}
return nil
}
- 递归
-
func searchBST(root *TreeNode, val int) *TreeNode {
if root == nil || root.Val == val {
return root
}
if root.Val > val {
return searchBST(root.Left, val)
}
return searchBST(root.Right, val)
}
-
98验证二叉搜索树
- 代码随想录 (programmercarl.com)
-
第一印象
- 根据由根节点向下查找的路径,每一个结点数值都应有一个数值的范围,由其上限和下限组成。也许可以使用递归保存其上下限依次进行比较。
-
讲解观后感
- 在二叉搜索树中序遍历后得到的应该是不重复且有序的。利用这一特性,可以更方便的完成这道题。
-
解题代码
- 递归检查
-
func isValidBST(root *TreeNode) bool {
if root == nil {
return true
}
return check(root,int(math.MinInt64),int(math.MaxInt64))
}
func check(node *TreeNode,min,max int) bool {
if node == nil {
return true
}
if min >= node.Val || max <= node.Val {
return false
}
return check(node.Right,node.Val,max) && check(node.Left,min,node.Val)
}
- 中序递归
-
func isValidBST(root *TreeNode) bool {
var prev *TreeNode
var travel func(node *TreeNode) bool
travel = func(node *TreeNode) bool {
if node == nil {
return true
}
leftRes := travel(node.Left)
if prev != nil && node.Val <= prev.Val {
return false
}
prev = node
rightRes := travel(node.Right)
return leftRes && rightRes
}
return travel(root)
}