mysql 遍历二叉树_算法:使用深度优先搜索对二叉树遍历、查找和删除

说明

深度优先搜索使用递归实现二叉树的前序,中序和后序遍历、查找和删除。

前序遍历

先输出父节点,再遍历左子树和右子树。

中序遍历

先遍历左子树,再输出父节点,再遍历右子树。

后序遍历

先遍历左子树,再遍历右子树,最后输出父节点。

小结

看输出父节点的顺序,就确定是前序,中序还是后序。

代码实现

func main() {

h1 := &HeroNode{id: 1, name: "宋江"}

h2 := &HeroNode{id: 2, name: "卢俊义"}

h3 := &HeroNode{id: 3, name: "吴用"}

h4 := &HeroNode{id: 4, name: "公孙胜"}

h5 := &HeroNode{id: 5, name: "关胜"}

h1.left = h2

h1.right = h3

h3.right = h4

h3.left = h5

bt := &BinaryTree{root: h1}

bt.preOrder() // 1 2 3 5 4

bt.infixOrder() // 2 1 5 3 4

bt.postOrder() // 2 5 4 3 1

bt.preOrderSearch(5)

bt.infixOrderSearch(5)

bt.postOrderSearch(5)

h6 := &HeroNode{id: 6, name: "林冲"}

h5.left = h6

bt.DeleteByNo(6)

bt.preOrder()

}

type BinaryTree struct {

root *HeroNode

}

func (bt *BinaryTree) preOrder() {

fmt.Println("前序遍历")

bt.root.preOrder()

}

func (bt *BinaryTree) infixOrder() {

fmt.Println("中序遍历")

bt.root.infixOrder()

}

func (bt *BinaryTree) postOrder() {

fmt.Println("后序遍历")

bt.root.postOrder()

}

func (bt *BinaryTree) preOrderSearch(no int) {

heroNode := bt.root.preOrderSearch(no)

if heroNode != nil {

fmt.Println("前序遍历查找:id#", heroNode.id, "name#", heroNode.name)

} else {

fmt.Println("前序遍历查找:未找到id=", no, "的节点")

}

}

func (bt *BinaryTree) infixOrderSearch(no int) {

heroNode := bt.root.infixOrderSearch(no)

if heroNode != nil {

fmt.Println("中序遍历查找:id#", heroNode.id, "name#", heroNode.name)

} else {

fmt.Println("中序遍历查找:未找到id=", no, "的节点")

}

}

func (bt *BinaryTree) postOrderSearch(no int) {

heroNode := bt.root.postOrderSearch(no)

if heroNode != nil {

fmt.Println("后序遍历查找:id#", heroNode.id, "name#", heroNode.name)

} else {

fmt.Println("后序遍历查找:未找到id=", no, "的节点")

}

}

func (bt *BinaryTree) DeleteByNo(no int) {

if bt.root == nil {

fmt.Println("空树")

} else {

if bt.root.id == no {

bt.root = nil

} else {

bt.root.DeleteByNo(no)

}

}

}

type HeroNode struct {

id int

name string

left *HeroNode

right *HeroNode

}

前序遍历

// preOrder 前序遍历 1 2 3 5 4

func (heroNode *HeroNode) preOrder() {

fmt.Println(heroNode.id, "#", heroNode.name)

if heroNode.left != nil {

heroNode.left.preOrder()

}

if heroNode.right != nil {

heroNode.right.preOrder()

}

}

中序遍历

// infixOrder 中序遍历 2 1 5 3 4

func (heroNode *HeroNode) infixOrder() {

if heroNode.left != nil {

heroNode.left.infixOrder()

}

fmt.Println(heroNode.id, "#", heroNode.name)

if heroNode.right != nil {

heroNode.right.infixOrder()

}

}

后序遍历

// postOrder 后序遍历 2 5 4 3 1

func (heroNode *HeroNode) postOrder() {

if heroNode.left != nil {

heroNode.left.postOrder()

}

if heroNode.right != nil {

heroNode.right.postOrder()

}

fmt.Println(heroNode.id, "#", heroNode.name)

}

前序查找

func (heroNode *HeroNode) preOrderSearch(no int) *HeroNode {

if heroNode.id == no {

return heroNode

}

var temp *HeroNode = nil

if heroNode.left != nil {

temp = heroNode.left.preOrderSearch(no)

}

if temp != nil {

return temp

}

if heroNode.right != nil {

temp = heroNode.right.preOrderSearch(no)

}

return temp

}

中序查找

func (heroNode *HeroNode) infixOrderSearch(no int) *HeroNode {

var temp *HeroNode = nil

if heroNode.left != nil {

temp = heroNode.left.infixOrderSearch(no)

}

if temp != nil {

return temp

}

if heroNode.id == no {

return heroNode

}

if heroNode.right != nil {

temp = heroNode.right.infixOrderSearch(no)

}

return temp

}

后序查找

func (heroNode *HeroNode) postOrderSearch(no int) *HeroNode {

var temp *HeroNode = nil

if heroNode.left != nil {

temp = heroNode.left.postOrderSearch(no)

}

if temp != nil {

return temp

}

if heroNode.right != nil {

temp = heroNode.right.postOrderSearch(no)

}

if temp != nil {

return temp

}

if heroNode.id == no {

return heroNode

}

return temp

}

删除

直接删除子树。

func (heroNode *HeroNode) DeleteByNo(no int) {

if heroNode.left != nil && heroNode.left.id == no {

heroNode.left = nil

return

}

if heroNode.right != nil && heroNode.right.id == no{

heroNode.right = nil

return

}

if heroNode.left != nil {

heroNode.left.DeleteByNo(no)

}

if heroNode.right != nil {

heroNode.right.DeleteByNo(no)

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值