一、
三种表示方法:双亲(双亲唯一,+一个指针,根结点用-1填充)、不好找孩子
孩子:树的度是多少,则有几个指针域用来存孩子,用不上nil
或者是有个域记录结点的度
或者孩子用单链表:双亲不好找
双亲兄弟:
二、二叉树:度为0.、1、2,且左右有顺序
特殊:
斜二叉树
满二叉树(叶子结点都在同一层、非叶子结点度一定为2)
完全二叉树(编号和满二叉树完全相同):可以用数组存放,可以通过下标直接从父亲结点得到孩子结点:左孩子:2k+1,右孩子:2(k+1) 最后一个非叶子结点是(N/2)-1,N为数组长度
94、中序 144、前序 45、后序
同个函数里递归调用有点问题,遇到空的则无了
试了单调一个函数,也没啥很好的效果,参考了一下这个老哥:
(3条消息) 力扣第94题Golang答案 二叉树的中序遍历_张大鹏520的博客-CSDN博客
应该多考虑result的作用于,还有当结点为空的时候的返回值
查了一下关于在函数里定义函数的问题:
由于不可以函数嵌套但可以声明变量,或者把另一个函数拽出来
以及另一种两个函数的解决方法:
(3条消息) 【Go 语法】不能在一个函数声明的内部再声明另一个函数_想变厉害的大白菜的博客-CSDN博客
用非递归:考虑用栈
101、对称二叉树
如图比较
// 递归: 注意return的大小写就行
func isSymmetric(root *TreeNode) bool {
if root == nil {return true}
return Solution(root.Left,root.Right)
}
func Solution(left,right *TreeNode) bool {
if left == nil && right == nil {return true}
if left == nil || right == nil{return false}
if left.Val != right.Val{
return false
}
return Solution(left.Left,right.Right)&&Solution(left.Right,right.Left)
}
//非递归用个队列,数组储存
func isSymmetric(root *TreeNode)bool{
return Proof(root,root)
}
func Proof(left,right *TreeNode)bool {
var q []*TreeNode
q = append(q,left)
q = append(q,right)
for len(q) >0 {
m,n:=q[0],q[1]
q = q[2:]
if m == nil && n == nil{ continue}
if m == nil || n == nil {return false}
if m.Val != n.Val {return false}
q = append(q,m.Left)
q = append(q,n.Right)
q = append(q,m.Right)
q = append(q,n.Left)
}
return true
}
104、二叉树的最大深度
func maxDepth(root *TreeNode) int {
if root == nil{return 0}
return max(maxDepth(root.Left),maxDepth(root.Right))+1
}
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
110、平衡二叉树
一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
由下向上递归(避免大量重复计算比较)
func isBalanced(root *TreeNode) bool {
if root == nil{return true}
return Compare(root) != -1
}
func Compare(root *TreeNode) int{
if root == nil{return 0}
left := Compare(root.Left)
right := Compare(root.Right)
if (left == -1)|| right==-1||Abs(left,right)>1{
return -1
}
return max(left,right) +1
}
func Abs(a,b int)int{
if a>=b{
return a-b
}else{
return b-a
}
}
func max(a,b int)int{
if a>=b{
return a
}else{
return b
}
}
226、反转二叉树
简简单单一个递归交换
func invertTree(root *TreeNode) *TreeNode {
if root == nil{return nil}
invertTree(root.Left)
invertTree(root.Right)
root.Left,root.Right = root.Right,root.Left
return root
}