一、二叉树
树: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.创建
typedef char DATATYPE;
typedef struct BiTNode
{
DATATYPE data;
struct BiTNode *lchild, *rchild;
}BiTNode;
2.遍历
//根左右
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.行遍历
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 设置显示字符串长度。