golang 235.二叉搜搜树的最近公共祖先
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 235.二叉搜搜树的最近公共祖先相关的知识,希望对你有一定的参考价值。
/**
* Definition for TreeNode.
* type TreeNode struct {
* Val int
* Left *ListNode
* Right *ListNode
* }
*/
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
// 适用于二叉树
// 如果 nil 说明当前分支子树没有对应节点
if root == nil {
return nil
}
if root.Val == p.Val || root.Val == q.Val {
// 找到任意一个就返回
return root
}
// 递归
left := lowestCommonAncestor(root.Left, p, q)
right := lowestCommonAncestor(root.Right, p, q)
// 如果左右子树都有找到, 那么 root 为公共祖先
if left != nil && right != nil {
return root
}
// 如果左子树中没有,那么 p q 都在右子树中, return right
if left == nil {
return right
}
// 如果左子树中有, 那么 p q 都在左子树中, return left
return left
}
func lowestCommonAncestor2(root, p, q *TreeNode) *TreeNode {
// 适用于二叉搜索树的递归写法
// 根据 p q 与 root 的大小关系判断
if p.Val < root.Val && q.Val < root.Val {
// 如果都小于root, 去左子树中查找
return lowestCommonAncestor2(root.Left, p, q)
} else if p.Val > root.Val && q.Val > root.Val {
// 如果都大于 root, 去右子树查找
return lowestCommonAncestor2(root.Right, p, q)
}
// 分叉了 return 当前节点
return root
}
func lowestCommonAncestor3(root, p, q *TreeNode) *TreeNode {
// 适用于二叉搜索树的循环写法
for root != nil {
// 根据 p q 与 root 的大小关系判断
if p.Val < root.Val && q.Val < root.Val {\
// 如果都小于root, 去左子树中查找
root = root.Left
} else if p.Val > root.Val && q.Val > root.Val {
// 如果都大于 root, 去右子树查找
root = root.Right
} else {
LevelOrder(root, func(t *TreeNode) {
fmt.Println(t.Val)
})
// 分叉了 return 当前节点
return root
}
}
return nil
}
golang各版本的变化
https://golang.org/doc/
https://golang.org/doc/go1.6
https://golang.org/doc/go1.5
https://golang.org/doc/go1.4
https://golang.org/doc/go1.3
https://golang.org/doc/go1.2
https://golang.org/doc/go1.1
以上是关于golang 235.二叉搜搜树的最近公共祖先的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode-235-二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先
leetcode235二叉搜索树的最近公共祖先
LeetCode235 二叉搜索树的最近公共祖先
LeetCode235 二叉搜索树的最近公共祖先