当前位置: 首页 > news >正文

怎么样制作个网站杭州网站建设方案服务公司

怎么样制作个网站,杭州网站建设方案服务公司,广州致峰网站建设,wordpress 自动采集插件二叉树 前言 完全二叉树 最底层节点按顺序从左到右排列。 满二叉树 一颗二叉树只有0度和2度的节点。 二叉搜索树 左子树上的所有节点的值均小于根节点的值。右子树上的所有节点的值均大于根节点的值。 平衡二叉搜索树 左右两个子树的高度差的绝对值不超过1 。 二叉树的存储…

二叉树

前言

  • 完全二叉树
    • 最底层节点按顺序从左到右排列。
  • 满二叉树
    • 一颗二叉树只有0度和2度的节点。
  • 二叉搜索树
    • 左子树上的所有节点的值均小于根节点的值。
    • 右子树上的所有节点的值均大于根节点的值。
  • 平衡二叉搜索树
    • 左右两个子树的高度差的绝对值不超过1 。

二叉树的存储方式有链式存储和数组存储。(线索二叉树、红黑树等)

1、链表存储方式

type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func NewTreeNode(val int) *TreeNode {return &TreeNode{Val: val}
}

2、数组存储方式

	// 完全二叉树:         1//                  /   \//                 2     3//                / \   / \//               4   5 6   7// 以下为前中后序遍历,以下例子也是这个结果//	1245367 //	4251637//	4526731

左子树:2 * i + 1

右子树:2 * i + 2

(i是数组的下标),元素值为arr[ 2 * i + 1 ]或arr[ 2 * i + 2 ]

接下来将讲解二叉树的几种遍历方式,我全篇使用链式存储结构。

一、深度优先遍历

1、前序遍历

1、递归遍历

// 前序遍历:根 -> 左 -> 右
func preorderTraversal(root *TreeNode) {if root != nil {fmt.Println(root.Val)         // 访问根节点preorderTraversal(root.Left)  // 递归遍历左子树preorderTraversal(root.Right) // 递归遍历右子树}
}

2、迭代遍历

深度优先遍历的递归版本都是简洁易读的,相较于迭代版本,更直观。迭代版本使用到了一种数据结构栈,以下我使用的栈是自己封装的库函数,如果有感兴趣的朋友,可以看shard库介绍,写shard库主要还是由于Golang没提供更多的数据结构模版。

// 前序遍历:根 -> 左 -> 右(迭代实现)
func preorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes := shard.NewStackArray[*TreeNode]()s.Push(root)for s.Len() > 0 {// 栈顶弹出并删除node, _ := s.Pop()fmt.Println(node.Val)// 先压右子节点,再压左子节点,因为栈是后进先出(LIFO)if node.Right != nil {s.Push(node.Right)}if node.Left != nil {s.Push(node.Left)}}
}

2、中序遍历

1、递归遍历

// 中序遍历:左 -> 根 -> 右
func inorderTraversal(root *TreeNode) {if root != nil {inorderTraversal(root.Left)  // 递归遍历左子树fmt.Println(root.Val)        // 访问根节点inorderTraversal(root.Right) // 递归遍历右子树}
}

2、迭代遍历

// 中序遍历:左 -> 根 -> 右(迭代实现)
func inorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes := shard.NewStackArray[*TreeNode]()cur := rootfor cur != nil || !s.IsEmpty() {for cur != nil {s.Push(cur)cur = cur.Left}node, _ := s.Pop()fmt.Println(node.Val)cur = node.Right}
}

3、后序遍历

1、递归遍历

// 后序遍历:左 -> 右 -> 根
func postorderTraversal(root *TreeNode) {if root != nil {postorderTraversal(root.Left)  // 递归遍历左子树postorderTraversal(root.Right) // 递归遍历右子树fmt.Println(root.Val)          // 访问根节点}
}

2、迭代遍历

// 后序遍历:左 -> 右 -> 根(迭代实现)
func postorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes1 := shard.NewStackArray[*TreeNode]()s1.Push(root)s2 := shard.NewStackArray[*TreeNode]()for !s1.IsEmpty() {node, _ := s1.Pop()s2.Push(node)if node.Left != nil {s1.Push(node.Left)}if node.Right != nil {s1.Push(node.Right)}}for !s2.IsEmpty() {node, _ := s2.Pop()fmt.Println(node.Val)}
}

二、广度优先遍历

1、层序遍历

// 层序遍历
func postorderTraversal(root *TreeNode) {if root == nil {return}q := shard.NewQueueArray[*TreeNode]()q.Enqueue(root)for !q.IsEmpty() {node, _ := q.Dequeue()fmt.Print(node.Val, " ")if node.Left != nil {q.Enqueue(node.Left)}if node.Right != nil {q.Enqueue(node.Right)}}
}

三、shard库介绍

GitHub链接:https://github.com/xzhHas/shard

shard库获取:

go get -u github.com/xzhHas/shard@latest

关于使用Golang写一个数据结构的库,目前只支持栈、队列、堆。

在这里插入图片描述

http://www.yayakq.cn/news/531914/

相关文章:

  • 南昌网站做做计算机网站的总结
  • t和p在一起怎么做网站北京工商注册登记网上服务系统
  • 网站建设费 账务处理长沙网站开发在线咨询
  • 轻量应用服务器做网站小程序开发平台哪家质量好
  • 新手如何做网站推广网络服务主要包括
  • 网站站点地图交通局网站建设方案策划书
  • 襄阳 网站建设商标查询官方入口
  • 免费建站网站一级大录像不卡哪个网站做自媒体比较好
  • 网站建设seo规范怎样建设自已的网站
  • 百度网站禁止访问怎么解除惠州高端网站建设
  • 网站后台建设怎么进入海南省建设工程质量监督网站
  • lnmpa wordpress sslseo01
  • 阿里巴巴国际贸易网站推广工具河南网站制作公司
  • 做网站什么程序南宁区建设银行招聘网站
  • 个人备案 什么网站支付网站费怎么做会计分录
  • 怎么自己弄网站深圳大梅沙
  • 上海响应式网站建设公司o2o 网站
  • 网站关键词没排名怎么办网站开发众筹
  • 营销型网站优势镇江网站建设工程
  • 西安网站建设运维关键词排名霸屏代做
  • 有人用wordpress做企业网站搜索引擎优化主要方法
  • 你们网站做301太平洋电脑网自助装机
  • 网站建设竣工验收报告乐云seo网站建设性价比高
  • 中国设计网站推荐宁德城乡建设部网站
  • 各大网站注册记录那个网站做的好
  • 怎样建立网站建设珠海网站运营
  • 校园二手交易网站建设方案购买商标
  • 织梦网站文章发布信息模板下载网店设计与装修
  • 网站建设与优化推广的话术中国十大做网站公司
  • 北京西城网站建设公司本地建站discuz