'添加二叉树/求深度,验证二叉搜索树'

This commit is contained in:
朱毅骏 2021-04-13 08:59:49 +08:00
parent 9136d7d1f6
commit 4c0d5cfd1b
4 changed files with 181 additions and 0 deletions

View 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))
}

View 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))
}

View 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))
}

View 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))
}