美文网首页我爱编程
数据结构:树(Tree)

数据结构:树(Tree)

作者: one_zheng | 来源:发表于2018-08-04 15:54 被阅读14次

树的定义

 一棵树(tree)是一些节点的集合。这个集合可以是空集;若不是空集,则树由称作(root)的节点r以及0个或多个非空的(子)树T1,T2,.....Tk组成,这些子树中每一棵的根都被来自根r的一条有有向的边(edge)所连结。

一般的树.png 一棵树.png

树的结构体:

type TreeNode struct {
 element interface{},
 firstChild *TreeNode,    // 儿子
 nextSibling *TreeNode, // 兄弟
}

二叉树

 二叉树是一棵树,其中每个节点都不能有多于两个的儿子。

二叉树的结构体:

// BinaryNode 二叉树节点
type BinaryNode struct {
    element        int
    leftChildNode  *BinaryNode
    rightChildNode *BinaryNode
}

// BinaryTree 二叉书
type BinaryTree struct {
    root *BinaryNode
}

// inorderTraversal 中序遍历
func inorderTraversal(root *BinaryNode) {
    if root == nil {
        return
    }
    inorderTraversal(root.leftChildNode)
    fmt.Println(root.element)
    inorderTraversal(root.rightChildNode)

}

// prefixraversal 前序遍历
func prefixraversal(root *BinaryNode) {
    if root == nil {
        return
    }
    fmt.Println(root.element)
    prefixraversal(root.leftChildNode)
    prefixraversal(root.rightChildNode)

}

// prefixravel 前序遍历非递归
func prefixravel(root *BinaryNode) {
    if root == nil {
        return
    }
    p := root
    stack := new(Stack)
    stack.push(p)

    for {
        if len(stack.Elements) == 0 {
            break
        }
        p = stack.pop()
        if p.rightChildNode != nil {
            stack.push(p.rightChildNode)
        }
        if p.leftChildNode != nil {
            stack.push(p.leftChildNode)
        }
    }
}

// inordertravel 中序遍历
func inordertravel(root *BinaryNode) {
    if root == nil {
        return
    }
    p := root
    stack := new(Stack)
    for {
        for {
            if p != nil {
                stack.push(p)
                p = p.leftChildNode
            } else {
                break
            }
        }
        p = stack.pop()
        if p.rightChildNode != nil {
            p = p.rightChildNode
        } else {
            p = nil
        }
        if len(stack.Elements) == 0 {
            break
        }
    }
}

// postOrder 后序遍历
func postOrder(root *BinaryNode) {
    if root == nil {
        return
    }
    p := root
    stack := new(Stack)
    for {
        for {
            if p != nil {
                stack.push(p)
                p = p.leftChildNode
            } else {
                break
            }
        }
        p = stack.pop()
        if len(stack.Elements) == 0 {
            break
        }
        //这里需要判断一下,当前p是否为栈顶的左子树,如果是的话那么还需要先访问右子树才能访问根节点
        //如果已经是不是左子树的话,那么说明左右子书都已经访问完毕,可以访问根节点了,所以讲p复制为NULL
        //取根节点
        if p == stack.peek().leftChildNode {
            p = stack.peek().rightChildNode
        } else {
            p = nil
        }
    }
}

二叉树非递归遍历:https://blog.csdn.net/ryjflyshy/article/details/78250348

相关文章

  • 索引

    01 B+ Tree 原理 1. 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是...

  • B+树原理

    B+树原理 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶...

  • Java数据结构之 树(Tree)

    Java数据结构之 树(Tree) 1. 二叉查找树(Binary Search Tree) 性质: 1)若左子树...

  • Merkle Tree

    Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkle Hash Tree,这是因为 它...

  • markle tree

    一、什么是 Merkle Tree?Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkl...

  • Mysql Innodb

    B+ Tree 原理 1. 数据结构 B Tree 指的是平衡树 。平衡树是一颗查找树,并且所有叶子节点位于同一...

  • JDK1.8 之 集合框架 TreeMap TreeSet

    了解 Tree 之前我们必须了解 红黑树 因为Tree 的数据结构就是红黑树 红黑树的特性(1)每个节点或者是黑色...

  • JavaScript 中的树数据结构

    JavaScript 中的树数据结构[https://stackfull.dev/tree-data-struct...

  • 数据结构: 可合并堆-左偏树 Leftist Tree

    数据结构: 可合并堆-左偏树 来自维基百科左偏树(英语: leftist tree或leftist heap), ...

  • 『数据结构』树(Tree)

    1. 概念 2. 二叉查找树2.1. 随机构造的二叉查找树2.2. 平均结点深度2.3. 不同的二叉树数目(Cat...

网友评论

    本文标题:数据结构:树(Tree)

    本文链接:https://www.haomeiwen.com/subject/jnlmvftx.html