数据结构(6)

一、二叉树

树:n(n>=0)个结点的有限集合,n = 0时为空树。由一个根结点衍生出两个子节点,二者互不相交,这种称之为二叉树。左边的为左子树,右边的为右子树。

特点:

(1)每个节点最多两个子树;

(2)左子树和右子树是有顺序的,次序不能颠倒;

(3)如果某节点只有一个子树,也要分左树和右数。

特殊的二叉树:

(1)斜树:所有结点都只有左节点,叫做左斜树,反之,叫做右斜树;

(2)满二叉树:除了叶子结点外,所有分支都有左右子树,并且所有子树都在同一层。

(3)完全二叉树:对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树(除非最后一层也被填满)。

特性:第 k 层(k≥1)最多有 2k−1 个节点。若二叉树有 n个节点,则其最小深度为 ⌈log 2 (n+1)(此时为满二叉树或完全二叉树)。

排序:在数据结构中共有三种排序方式,他们分别是:前序、中序和后序。

上图树中的三种排序顺序为:

前序(根左右):ABDGHCEIF

中序(左根右):GDHBAEICF

后序(左右根):GHDBIEFCA

二叉树的行为:

1.创建

cs 复制代码
typedef char DATATYPE;

typedef struct BiTNode
{
    DATATYPE data;
    struct BiTNode *lchild, *rchild;
}BiTNode;

2.遍历

cs 复制代码
//根左右
void PreOrderTraverse(BiTNode *root)
{
    if(NULL == root)
    {
        return ;
    }
    else
    {
        printf("%c", root->data);
        PreOrderTraverse(root->lchild);
        PreOrderTraverse(root->rchild);
    }
    return ;
}


//左根右
void InOrderTraverse(BiTNode *root)
{
    if(NULL == root)
    {
        return ;
    }
    else
    {
        InOrderTraverse(root->lchild);
        printf("%c",root->data);
        InOrderTraverse(root->rchild);
        
    }
    return ;
}



//左右根
void PostOrderTraverse(BiTNode *root)
{
    if(NULL == root)
    {
        return ;
    }
    else
    {
        PostOrderTraverse(root->lchild);
        PostOrderTraverse(root->rchild);
        printf("%c", root->data);
    }
    return ;
}

3.行遍历

cs 复制代码
char data[] = "ABD#G###CE#h##FI###" ;
int ind = 0;
void CreateTree(BiTNode **root)
{
    char c = data[ind++];
    if('#' == c)
    {
        *root = NULL;
        return ;
    }
    else
    {
        *root = malloc(sizeof(BiTNode));
        if(NULL == *root)
        {
            printf("malloc error!\n");
            return ;
        }
        (*root)->data = c;
        CreateTree(&(*root)->lchild);
        CreateTree(&(*root)->rchild);
    }
    return ;
}

二、gdb

GDB(GNU Debugger)是一款功能强大的命令行调试工具,主要用于调试 C、C++ 等编译型语言的程序,支持断点设置、变量查看、内存检查、程序单步执行等功能。

指令:

一般指令:

1.gcc -g 1.c 打开调试选项(-g)

2.gdb a.out运行gdb

3.b fun.c :36 设置断点在第36行(运行到35行)

4.r 运行

5.n 运行下一行

6.使用p命令,查看变量或指针

7.bt 查看栈结构

其他指令:

1.n 步过,如果是函数直接调用结束;

2.s 步入,如果是函数,进入函数;

3.display:与p类似,在运行过程中一直显示变量的值,display a;

4.c continue用于跳出循环;

5.return 返回调用处;

6.set print elements 300 设置显示字符串长度。