总结
- 先序 中序 后序 遍历就能解决一些算法题。
- 层次遍历 使用队列。
- 从左子树 、右子树 获取答案,然后结合根节点来 计算答案。
- 前缀树,比Hashset更稳定。O(1),只不过占内存。trie树。
- 递归。递归,递归。 到叶子节点收集答案。然后移除路径。
| package main |
| |
| import ( |
| "fmt" |
| "math" |
| |
| . "github.com/isdamir/gotype" |
| ) |
| |
| |
| |
| |
| func arrayToTree(arr []int, start int, end int) *BNode { |
| var root *BNode |
| if end >= start { |
| |
| root = NewBNode() |
| mid := (start + end + 1) / 2 |
| root.Data = arr[mid] |
| root.LeftChild = arrayToTree(arr, start, mid-1) |
| root.RightChild = arrayToTree(arr, mid+1, end) |
| } |
| |
| return root |
| } |
| |
| |
| func PrintTreeLayer(root *BNode) { |
| |
| |
| if root == nil { |
| return |
| } |
| |
| q := &SliceQueue{} |
| q.EnQueue(root) |
| for !q.IsEmpty() { |
| cur_node := q.DeQueue().(*BNode) |
| fmt.Print(cur_node.Data, " ") |
| if cur_node.LeftChild != nil { |
| q.EnQueue(cur_node.LeftChild) |
| } |
| if cur_node.RightChild != nil { |
| q.EnQueue(cur_node.RightChild) |
| } |
| } |
| } |
| |
| |
| var maxSum = math.MinInt64 |
| |
| func FindMaxSubTree(root *BNode, maxRoot *BNode) int { |
| if root == nil { |
| return 0 |
| } |
| |
| lmax := FindMaxSubTree(root.LeftChild, maxRoot) |
| rmax := FindMaxSubTree(root.RightChild, maxRoot) |
| |
| sum := lmax + rmax + root.Data.(int) |
| if sum > maxSum { |
| maxSum = sum |
| maxRoot.Data = root.Data |
| } |
| return sum |
| } |
| |
| |
| |
| var PHead *BNode |
| var PEnd *BNode |
| |
| func InOrderBSTree(root *BNode) { |
| |
| if root == nil { |
| return |
| } |
| |
| InOrderBSTree(root.LeftChild) |
| |
| root.LeftChild = PEnd |
| if PEnd == nil { |
| PHead = root |
| } else { |
| PEnd.RightChild = root |
| } |
| |
| PEnd = root |
| |
| InOrderBSTree(root.RightChild) |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| func IsAfterOrder(arr []int, start int, end int) bool { |
| if arr == nil { |
| return false |
| } |
| root := arr[end] |
| var i, j int |
| |
| |
| |
| for i = start; i < end; i++ { |
| if arr[i] > root { |
| break |
| } |
| } |
| for j = i; j < end; j++ { |
| if arr[j] < root { |
| return false |
| } |
| } |
| |
| |
| |
| |
| lresult := true |
| rresult := true |
| |
| if i > start { |
| lresult = IsAfterOrder(arr, start, i-1) |
| } |
| |
| if j < end { |
| rresult = IsAfterOrder(arr, i, end) |
| } |
| |
| return lresult && rresult |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| func GetPathFromRoot(root *BNode, node *BNode, s *SliceStack) bool { |
| if root == nil { |
| return false |
| } |
| |
| if root.Data.(int) == node.Data.(int) { |
| s.Push(root) |
| return true |
| } |
| |
| if GetPathFromRoot(root.LeftChild, node, s) || GetPathFromRoot(root.RightChild, node, s) { |
| s.Push(root) |
| return true |
| } |
| |
| return false |
| } |
| |
| func FindParentNode(root, node1, node2 *BNode) *BNode { |
| s1 := NewSliceStack() |
| s2 := NewSliceStack() |
| |
| GetPathFromRoot(root, node1, s1) |
| GetPathFromRoot(root, node2, s2) |
| |
| var parent *BNode |
| for t1, t2 := s1.Pop().(*BNode), s2.Pop().(*BNode); t1 != nil && t2 != nil && t1.Data.(int) == t2.Data.(int); { |
| parent = t1 |
| t1 = s1.Pop().(*BNode) |
| t2 = s2.Pop().(*BNode) |
| } |
| |
| return parent |
| |
| } |
| |
| |
| |
| func FindParentNodeReverse(root, node1, node2 *BNode) *BNode { |
| |
| if root == nil || root.Data.(int) == node1.Data.(int) || root.Data.(int) == node2.Data.(int) { |
| return root |
| } |
| |
| l := FindParentNodeReverse(root.LeftChild, node1, node2) |
| r := FindParentNodeReverse(root.RightChild, node1, node2) |
| |
| if l == nil { |
| return r |
| } else if r == nil { |
| return l |
| } else { |
| return root |
| } |
| |
| } |
| |
| |
| |
| func DupTree(root *BNode) *BNode { |
| if root == nil { |
| return nil |
| } |
| |
| dupTree := NewBNode() |
| |
| dupTree.Data = root.Data |
| dupTree.LeftChild = DupTree(root.LeftChild) |
| dupTree.RightChild = DupTree(root.RightChild) |
| |
| return dupTree |
| |
| } |
| |
| |
| |
| |
| |
| func FindRoad(root *BNode, num, sum int, v []int) { |
| sum += root.Data.(int) |
| |
| v = append(v, root.Data.(int)) |
| |
| if root.LeftChild == nil && root.RightChild == nil && sum == num { |
| for _, v := range v { |
| fmt.Print(v, " ") |
| } |
| } |
| |
| if root.LeftChild != nil { |
| FindRoad(root.LeftChild, num, sum, v) |
| } |
| |
| if root.RightChild != nil { |
| FindRoad(root.RightChild, num, sum, v) |
| } |
| |
| sum -= v[len(v)-1] |
| v = v[:len(v)-1] |
| |
| } |
| |
| |
| |
| func ReverseTree(root *BNode) { |
| if root == nil { |
| return |
| } |
| |
| ReverseTree(root.LeftChild) |
| ReverseTree(root.RightChild) |
| |
| tmp := root.LeftChild |
| root.LeftChild = root.RightChild |
| root.RightChild = tmp |
| } |
| |
| |
| var trieNode *TrieNode |
| |
| func main() { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| r := NewBNode() |
| n1 := NewBNode() |
| n2 := NewBNode() |
| n3 := NewBNode() |
| n4 := NewBNode() |
| |
| r.Data = 6 |
| n1.Data = 3 |
| n2.Data = -7 |
| n3.Data = -1 |
| n4.Data = 9 |
| r.LeftChild = n1 |
| r.RightChild = n2 |
| n1.LeftChild = n3 |
| n1.RightChild = n4 |
| |
| FindRoad(r, -1, 0, make([]int, 0)) |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!