Data structure and algorithm tree

1. Tree
1. Overview
(1) Tree model:

"树"(Tree)是由n≥0"节点"(Node)组成的有层次关系的集合,其中没有父结点的结点称为"根结点"(Root),没有子节点的节点称为"叶节点"(Leaf).
空集也是树,称为"空树"(Empty Tree).若n>0,则树由1个根节点r和k≥0"子树"(Subtree)T1,T2...Tk组成.这些子树中的根节点都与r通过1条有向
的"边"(Edge)所连接.边所表示的关系为父子关系,r为"父节点"(Parent)而子树中的根为r的"子节点"(Child),这样就在树中建立了1种层次关系.这些
子树的根节点互为"兄弟节点"(Sibling).子树也由上述方法定义,直到到达叶节点

(2) Other concepts:

从节点n1到nk的"路径"(Path)是节点n1,n2...nk的1个序列,满足对1≤i<k,ni是n{
    
    i+1}的父节点.路径的"长度"(Length)为路径上边的数量,即k-1.
任意节点ni的"深度"(Depth)为从根到ni的路径的长度;ni的"高度"(Height)则是ni到任意叶节点的最长路径的长度.树的高度等于其根节点的高度,深
度等于其最深的叶节点的深度.如果存在从n1到n2的路径,那么n1是n2的"祖先"(Ancestor)而n2是n1的"后裔"(Descendant);在此基础上,如果n1≠n2,
那么n1是n2的"真祖先"(Proper Ancestor)而n2是n1的"真后裔"(Proper Descendant)

Insert picture description here
(3) Nature:

树的大部分操作的时间复杂度都平均为O(log N),其中N为节点总数

2. Implement
(1) tree node:

struct TreeNode;
typedef int ElementType;
typedef struct TreeNode * PtrToNode;

struct TreeNode {
    
    
    ElementType Element;//储存本节点的元素
    PtrToNode FirstChild;//指向第1个子节点的指针
    PtrToNode NextSibling;//指向下1个兄弟节点的指针
};

Insert picture description here
(2) Tree traversal:

//注意:以下为伪代码

遍历树的时间复杂度为O(N),方法主要有3:"先序遍历"(Preorder Traversal):节点处的工作是在其子节点处的工作前完成的
static void ListT(Tree T,int Depth) {
    
    
    if (T is a legitimate input) {
    
    
        PrintElement(T,Depth);
        if (T has child) {
    
    
            for child of D {
    
    
                ListT(child,Depth + 1);
            }
        }
    }
}
void ListTree(Tree T) {
    
    
    ListT(T,0);
}"后序遍历"(Postorder Traversal):节点处的工作是在其子节点处的工作后完成的
static void TreeSize(Tree T) {
    
    
    int TotalSize = 0;
    if (T is legitimate input) {
    
    
        TotalSize = FileSize(T);
        if (T has child) {
    
    
            for child of T {
    
    
                TotalSize += TreeSize(child);
            }
        }
    }
    return TotalSize;
}"中序遍历"(Inorder Traversal):节点处的工作部分在其子节点处的工作前完成,部分在其子节点处的工作后完成

3. Application:

最流行的功能是实现操作系统的目录结构

Two. Binary tree
1. Overview
(1) Concept:

如果1棵树的任何1个节点的子节点都不超过2,就称其为"二叉树"(Binary Tree)

(2) Nature:

二叉树的平均深度远小于N,而为O(sqrt(N)),其中N为节点总数

(3) Application:

①查找
②编译器设计

2. Realization:

struct BinaryTreeNode;
typedef int ElementType;
typedef struct BinaryTreeNode * PtrToNode;
typedef PtrToNode Tree;

struct BinaryTreeNode {
    
    
    ElementType Element;//元素
    Tree Left;//第1个子节点
    Tree Right;//第2个子节点
};

3. Expression tree
(1) concept:

//注意:表达式树不一定是二叉树

"表达式树"(Expression Tree)的叶节点是"操作数"(Operand),如常数/变量;而其他节点为"操作符"(Operator),用于表示1个表达式.具体来说,每
个节点处的操作符用于连接该节点下的各个子树,从而递归地形成表达式.如下图中的表达式树表示((a+(b*c))+(((d*e)+f)*g)):

Insert picture description here

若采取中序/后序/先序遍历,则得到的表达式分别为"中序表达式"(Infix Expression)/"后序表达式"(Postfix Expression)"逆波兰表达式"
(Reverse Polish Notation)/"先序表达式"(Prefix Expression)"波兰表达式"(Polish Notation).((a+(b*c))+(((d*e)+f)*g))是
中序表达式,abc*+de*f+g*+是相应的后续表达式,++a*bc*+*defg是相应的先序表达式

(2) Build an expression tree:

//通过后缀表达式构建:

Guess you like

Origin blog.csdn.net/weixin_46131409/article/details/113881356
Recommended