2023王道C语言训练营(线索二叉树)
线索二叉树
(大题绝对不可能出,在工业界没有任何用处) 当一个结点的左孩子指针或者右孩子指针是空着的,线索二叉树就是不让结点的左右孩子指针空着
头文件
#include<stdio.h> #include<stdlib.h> #include<string.h>
结构体
typedef char ElemType; typedef struct ThreadNode { ElemType data; struct ThreadNode* lchild, * rchild; int ltag, rtag; }ThreadNode,*ThreadTree;
主要函数
//手工建线索树,总共5个结点 void BulidThreadTree(ThreadTree& T) { ThreadTree arr[5]; int i; for (i = 0; i < 5; i++) { arr[i] = (ThreadTree)malloc(sizeof(ThreadNode)); //memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 memset(arr[i], 0, sizeof(ThreadNode)); arr[i]->data = A + i; } arr[0]->lchild = arr[1]; arr[0]->rchild = arr[2]; arr[1]->lchild = arr[3]; arr[2]->lchild = arr[4]; T = arr[0]; } void InThread(ThreadTree& p, ThreadTree& pre) { if (p != NULL) { // InThread(p->lchild, pre); if (p->lchild == NULL)//左边为NULL { p->lchild = pre; p->ltag = 1; } if (pre != NULL && pre->rchild == NULL) { //pre节点右孩子为NULL,就让其指向后继节点 pre->rchild = p; pre->rtag = 1; } pre = p; InThread(p->rchild, pre); } } void CreateInThread(ThreadTree T) { ThreadTree pre = NULL;//使用辅助指针 if (T != NULL) { InThread(T, pre); pre->rchild = NULL; pre->rtag = 1; } } //中序遍历下的第一个结点 ThreadNode* Firstnode(ThreadNode* p) { while (p->ltag == 0) p = p->lchild; return p; }
主函数
int main() { ThreadTree T; ThreadTree p; BulidThreadTree(T); CreateInThread(T);//构建线索二叉树 p = Firstnode(T); printf("最左下节点值为:%c ", p->data); system("pause"); }