go acm模式 二叉树

输入前序

package main

import (
	"fmt"
	"strconv"
	"strings"
)

// 定义树节点结构
type TreeNode struct {
	val   int
	left  *TreeNode
	right *TreeNode
}

// 构建二叉树
func buildTree(values []string) (*TreeNode, int) {
	if len(values) == 0 || values[0] == "null" {
		return nil, 1
	}
	val, _ := strconv.Atoi(values[0])
	node := &TreeNode{val: val}
	leftChild, leftCount := buildTree(values[1:])
	rightChild, rightCount := buildTree(values[1+leftCount:])
	node.left = leftChild
	node.right = rightChild
	return node, 1 + leftCount + rightCount
}

// 判断是否存在满足条件的路径
func hasPathSum(root *TreeNode, targetSum int) bool {
	if root == nil {
		return false
	}
	if root.left == nil && root.right == nil {
		return targetSum == root.val
	}
	return hasPathSum(root.left, targetSum-root.val) || hasPathSum(root.right, targetSum-root.val)
}

func main() {
	// 输入处理
	var input string
	fmt.Scanln(&input)
	targetSumStr := ""
	fmt.Scanln(&targetSumStr)
	targetSum, _ := strconv.Atoi(targetSumStr)

	values := strings.Split(input, ",")
	root, _ := buildTree(values)

	// 判断是否存在满足条件的路径
	if hasPathSum(root, targetSum) {
		fmt.Println("True")
	} else {
		fmt.Println("False")
	}
}

输入层序

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// 定义树节点结构
type TreeNode struct {
	val   int
	left  *TreeNode
	right *TreeNode
}

// 根据层序遍历结果构建二叉树
func buildTree(levelOrder []string) *TreeNode {
	if len(levelOrder) == 0 || levelOrder[0] == "null" {
		return nil
	}
	root := &TreeNode{val: parseInt(levelOrder[0])}
	nodes := []*TreeNode{root}
	i := 1

	for len(nodes) > 0 && i < len(levelOrder) {
		current := nodes[0]
		nodes = nodes[1:]

		// 处理左子节点
		if i < len(levelOrder) && levelOrder[i] != "null" {
			current.left = &TreeNode{val: parseInt(levelOrder[i])}
			nodes = append(nodes, current.left)
		}
		i++

		// 处理右子节点
		if i < len(levelOrder) && levelOrder[i] != "null" {
			current.right = &TreeNode{val: parseInt(levelOrder[i])}
			nodes = append(nodes, current.right)
		}
		i++
	}
	return root
}

// 将字符串转换为整数,处理可能的 "null" 值
func parseInt(s string) int {
	if s == "null" {
		return 0 // 实际上这里返回什么并不重要,因为对应的节点不会被加入树中
	}
	val, _ := strconv.Atoi(s)
	return val
}

// 判断是否存在满足条件的路径
func hasPathSum(root *TreeNode, targetSum int) bool {
	if root == nil {
		return false
	}
	if root.left == nil && root.right == nil {
		return targetSum == root.val
	}
	return hasPathSum(root.left, targetSum-root.val) || hasPathSum(root.right, targetSum-root.val)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	levelOrderInput := scanner.Text()
	scanner.Scan()
	targetSumStr := scanner.Text()

	// 解析输入
	levelOrder := strings.Split(levelOrderInput, ",")
	targetSum, _ := strconv.Atoi(targetSumStr)

	// 构建二叉树
	root := buildTree(levelOrder)

	// 检查是否存在满足条件的路径
	if hasPathSum(root, targetSum) {
		fmt.Println("True")
	} else {
		fmt.Println("False")
	}
}

全部评论

相关推荐

评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务