构造平衡二叉树例题_数据结构和算法之二叉树

二叉树是树型数据结构的一种,二叉就是每个节点最多有两个子树(度不超过两个),就是左节点、右节点。根据不同的特点又引申出完全二叉树、满二叉树、平衡二叉树、红黑树、二叉排序树、一般二叉树等。

节点是二叉树的基础,节点连接成复杂结构的单元;二叉树是n个节点集合,有且仅有一个根节点,最多有连个子节点,每个子节点又可以看成子树,所有子树是不相交的。树的定义本身就是一个递归的概念,所以树的各种操作也都是递归来实现的。度是节点拥有的子树的个数,二叉树的度最大为2;节点的层,就是节点在树的哪个深度,树的深度树树最大的层数。

6cd91b9c130a47e7283d0b56dbff2978.png

斜树,只有左子树的二叉树叫左斜树,只有右子树的二叉树叫右斜树,统称为斜树。

1d32c9fdf7959a632589c010160f8a3e.png
0fc517c763d87a52d80396d7b2e453d1.png

满二叉树,所有非叶子节点的度都是2,所有叶子节点都在同一层

6392c713c1786a785c0f91833bd41c97.png

完全二叉树,叶子节点在最下层和次下层,且最下层的叶子节点在左侧,满二叉树是完全二叉树的一种。

174ee92f2e510c46c0a0367bfb64a397.png

二叉树的存储结构,顺序存储结构数组存储,下标表示节点的位置

ce71f3b83cb581427b308bf895134f36.png

链表存储

9e0eb9cc13322668c537a177f075581e.png
type TreeNode struct{   Val int   Left *TreeNode   Right *TreeNode }
5782212e39a753c217db87f3d391714c.png

二叉树的遍历,前中后序遍历,深度广度优先遍历。

前序遍历从跟节点出发先遍历左子树的左节点一次从左到右访问,ABDHIEJCFG

中序遍历,从左中右访问模式,HDIBJEAFCG

后续遍历,左右中访问模式,HIDJEBFGCA

//前序遍历func PreOrderTraversal(tree *TreeNode)  {if tree == nil {return}fmt.Println("%d ->", tree.Val)PreOrderTraversal(tree.Left)PreOrderTraversal(tree.Right)}// 中序遍历func MidOrderTraversal(tree *TreeNode) {if tree == nil {return}MidOrderTraversal(tree.Left)fmt.Printf(" %d -> ", tree.Val)MidOrderTraversal(tree.Right)}// 后序遍历func PostOrderTraversal(tree *TreeNode) {if tree == nil {return}PostOrderTraversal(tree.Left)PostOrderTraversal(tree.Right)fmt.Printf(" %d -> ", tree.Val)}

按层遍历,从上到下按层依次遍历,ABCDEFGHIJ

// 按层遍历func LevelOrderTraversal(tree *TreeNode) {if tree == nil {return}// 采用队列实现queue := make([]*TreeNode, 0)queue = append(queue, tree) // queue pushfor len(queue) > 0 {tree = queue[0]fmt.Printf(" %d -> ", tree.Val)queue = queue[1:] // queue popif tree.Left != nil {queue = append(queue, tree.Left)}if tree.Right != nil {queue = append(queue, tree.Right)}}}

典型例题:已知前序遍历序列和后序遍历序列,不可以唯一确定一棵二叉树;若一棵二叉树的前序遍历为ABCDEF,中序遍历为CBAEDF,请画出这棵二叉树?

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

八亿中产

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值