一:二叉树的建立
1:二叉链表的结点结构定义代码
// 二叉树的二叉链表结点结构定义
typedef struct BitNode
{
TElemType data; // 结点数据
struct BitNode *lchild, *rchild // 左右孩子指针
} BitNode, *BiTree;
2:二叉树的建立的代码部分
// 按前序遍历输入二叉树中结点的值(一个字符)
// 若输入‘#’,则表示空树,构造二叉链表表示二叉树 T
void CreatBiTree(BiTree T)
{
TElemType ch;
scanf("%c", &ch);
if(ch == 'c'){
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiTnode));
if(T == NULL){
//出现这种情况则是内存已满,无空间可分配
exit(OVERFLOW);
}
T->data = ch; //生成根节点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
}
//其实树节点的建立构成是函数的递归过程。
二:线索二叉树
1:线索二叉树原理
没有引用线索二叉树原理之前:
对于一个有 n 个结点的二叉链表,每个结点都有指向左右孩子的两个指针域,所
以一共是 2n 个指针域。而 n 个结点的二叉树一共有 n-1 条分支线,所以,这种情
况下其实是存在 2n-(n-1)=n+1 个空指针域的。这些空间不存储任何事物,白白的浪
费内存的资源。
引用后:
假如我们对一个二叉树进行中序遍历得到了HDIBJEAFCG这样的字符序列,遍历
过后,我们可以知道,结点 I 的前是 D ,后继是B,结点 F 的前驱是 A ,后继是
C。也就是说,我们可以很清楚的知道任意一个结点,它的前驱和后继是哪一个。我
们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应
的二叉树就称为线索二叉树。
2:线索二叉树的结点结构
typedef enum {
Link, Thread} PointerTag;
// link