'添加二叉树/求深度,验证二叉搜索树'
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