'添加二叉树/求深度,验证二叉搜索树'
This commit is contained in:
parent
9136d7d1f6
commit
4c0d5cfd1b
41
leetcode/初级算法/树/二叉树的最大深度/main.go
Normal file
41
leetcode/初级算法/树/二叉树的最大深度/main.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
/**
|
||||
给定一个二叉树,找出其最大深度。
|
||||
|
||||
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
|
||||
|
||||
说明:叶子节点是指没有子节点的节点。
|
||||
|
||||
示例:
|
||||
给定二叉树 [3,9,20,null,null,15,7],
|
||||
|
||||
3
|
||||
/ \
|
||||
9 20
|
||||
/ \
|
||||
15 7
|
||||
返回它的最大深度3 。
|
||||
*/
|
||||
|
||||
type TreeNode struct {
|
||||
Val int
|
||||
Left *TreeNode
|
||||
Right *TreeNode
|
||||
}
|
||||
|
||||
func maxDepth(root *TreeNode) int {
|
||||
if root ==nil {
|
||||
return 0
|
||||
}
|
||||
maxRight:= maxDepth(root.Right)
|
||||
maxLeft:= maxDepth(root.Left)
|
||||
if maxRight > maxLeft {
|
||||
return maxRight+1
|
||||
} else {
|
||||
return maxLeft+1
|
||||
}
|
||||
}
|
||||
func main() {
|
||||
t := &TreeNode{2, nil, &TreeNode{1, &TreeNode{2, nil, nil}, nil}}
|
||||
print(maxDepth(t))
|
||||
}
|
47
leetcode/初级算法/树/验证二叉搜索树/main.go
Normal file
47
leetcode/初级算法/树/验证二叉搜索树/main.go
Normal file
@ -0,0 +1,47 @@
|
||||
package main
|
||||
/**
|
||||
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
|
||||
|
||||
假设一个二叉搜索树具有如下特征:
|
||||
|
||||
节点的左子树只包含小于当前节点的数。
|
||||
节点的右子树只包含大于当前节点的数。
|
||||
所有左子树和右子树自身必须也是二叉搜索树。
|
||||
示例1:
|
||||
输入:
|
||||
2
|
||||
/ \
|
||||
1 3
|
||||
输出: true
|
||||
示例2:
|
||||
输入:
|
||||
5
|
||||
/ \
|
||||
1 4
|
||||
/ \
|
||||
3 6
|
||||
输出: false
|
||||
解释: 输入为: [5,1,4,null,null,3,6]。
|
||||
根节点的值为 5 ,但是其右子节点值为 4 。
|
||||
*/
|
||||
|
||||
type TreeNode struct {
|
||||
Val int
|
||||
Left *TreeNode
|
||||
Right *TreeNode
|
||||
}
|
||||
func isValidBST(root *TreeNode) bool {
|
||||
if root == nil {
|
||||
return true
|
||||
}
|
||||
if root.Left !=nil && root.Left.Val <= root.Val || root.Right !=nil && root.Val <= root.Right.Val {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
return isValidBST(root.Left) && isValidBST(root.Right)
|
||||
}
|
||||
func main() {
|
||||
t := &TreeNode{2, &TreeNode{1, nil, nil}, &TreeNode{3, nil, nil}}
|
||||
print(isValidBST(t))
|
||||
}
|
60
leetcode/初级算法/链表/回文链表/main.go
Normal file
60
leetcode/初级算法/链表/回文链表/main.go
Normal file
@ -0,0 +1,60 @@
|
||||
package main
|
||||
/**
|
||||
请判断一个链表是否为回文链表。
|
||||
|
||||
示例 1:
|
||||
|
||||
输入: 1->2
|
||||
输出: false
|
||||
示例 2:
|
||||
|
||||
输入: 1->2->2->1
|
||||
输出: true
|
||||
*/
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
//慢 递归添加数组
|
||||
func isPalindrome2(head *ListNode) bool {
|
||||
nums := []int{}
|
||||
var getList func(head *ListNode,nums []int) []int
|
||||
getList = func(head *ListNode,nums []int) []int {
|
||||
nums = append(nums, head.Val)
|
||||
if head==nil || head.Next == nil {
|
||||
return nums
|
||||
}
|
||||
return getList(head.Next,nums)
|
||||
}
|
||||
nums = getList(head,nums)
|
||||
start :=0
|
||||
end:= len(nums)-1
|
||||
for start<end {
|
||||
if nums[start] != nums[end] {
|
||||
return false
|
||||
}
|
||||
start++
|
||||
end--
|
||||
}
|
||||
return true
|
||||
}
|
||||
//快的 循环
|
||||
func isPalindrome(head *ListNode) bool {
|
||||
vals := []int{}
|
||||
for ; head != nil; head = head.Next {
|
||||
vals = append(vals, head.Val)
|
||||
}
|
||||
n := len(vals)
|
||||
for i, v := range vals[:n/2] {
|
||||
if v != vals[n-1-i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func main() {
|
||||
l := &ListNode{1, &ListNode{2, &ListNode{2, nil}}}
|
||||
print(isPalindrome(l))
|
||||
}
|
||||
|
33
leetcode/初级算法/链表/环形链表/main.go
Normal file
33
leetcode/初级算法/链表/环形链表/main.go
Normal file
@ -0,0 +1,33 @@
|
||||
package main
|
||||
/**
|
||||
给定一个链表,判断链表中是否有环。
|
||||
|
||||
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
|
||||
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
|
||||
如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
|
||||
|
||||
如果链表中存在环,则返回 true 。 否则,返回 false 。
|
||||
|
||||
*/
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
func hasCycle(head *ListNode) bool {
|
||||
seen := map[*ListNode]struct{}{}
|
||||
for head != nil {
|
||||
//map中有该head证明已经存过,有环
|
||||
if _, ok := seen[head]; ok {
|
||||
return true
|
||||
}
|
||||
seen[head] = struct{}{}
|
||||
head = head.Next
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func main() {
|
||||
l := &ListNode{1, &ListNode{2, &ListNode{2, nil}}}
|
||||
l.Next = l
|
||||
print(hasCycle(l))
|
||||
}
|
Loading…
Reference in New Issue
Block a user