/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcdiameterOfBinaryTree(root *TreeNode)int { var max int// 记录两节点之间的最大路径(直接) var postorder func(root *TreeNode)int postorder = func(root *TreeNode)int { if root != nil { var left, right int// 左右子树深度 if root.Left != nil { left = postorder(root.Left) +1// 计算左子树深度 } if root.Right != nil { right = postorder(root.Right)+1// 计算右子树深度 } if left + right > max { // 更新两节点的最大路径 max = left + right } // 返回左右子树中深度较大的值 if left > right { return left } else { return right } } return0 } postorder(root) return max }
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcisValidBST(root *TreeNode)bool { flag := true// 标记是否是二叉搜索树 lastVisit := math.MinInt64 // 上一个访问的节点 var inorder func(root *TreeNode)
inorder = func(root *TreeNode) { if root != nil { inorder(root.Left) if root.Val <= lastVisit { // 中序遍历序列不是递增的,则不是二叉搜索树 flag = false } lastVisit = root.Val inorder(root.Right) } } inorder(root)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcisValidBST(root *TreeNode)bool { lastVisit := math.MinInt64 stack := make([]*TreeNode, 0) // 栈 cur := root // 遍历指针
forlen(stack) > 0 || cur != nil { for cur != nil { // 当前节点入栈,进入左子树 stack = append(stack, cur) cur = cur.Left } iflen(stack) > 0 { // 访问当前栈顶节点 cur = stack[len(stack)-1] if cur.Val <= lastVisit { // 遍历序列不严格递增,不是二叉搜索树,直接返回false returnfalse } lastVisit = cur.Val // 弹出栈顶 stack = stack[:len(stack)-1] // 进入右子树 cur = cur.Right } }