LeetCode力扣Golang实现树:94、144、45、104、101、110、226

一、

三种表示方法:双亲(双亲唯一,+一个指针,根结点用-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

由于不可以函数嵌套但可以声明变量,或者把另一个函数拽出来

以及另一种两个函数的解决方法:

(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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值