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 二叉搜索树的最近公共祖先