8、二叉树的链式存储结构类型描述
 typedef struct BiTNode {
 int data;
 struct BiTNode *lchild, *rchild;
 }BiTNode,*BiTree;
 9、此部分程序中涉及到栈和队列的部分在前面几篇中提到,在这里就不详细给出咯。
1)先序遍历
 void preorder(BiTree T)
 {
 if (T != NULL)
 {
 visit(T);
 preorder(T->lchild);
 preorder(T->rchild);
 }
 }
 2)中序遍历
 void inorder(BiTree T)
 {
 if (T != NULL)
 {
 inorder(T->lchild);
 visit(T);
 inorder(T->rchild);
 }
 }
 3)中序遍历利用栈
 void inorder1(BiTree T)
 {
 Sqstack S;
 initstack(S);
 BiTree p = T;
 while (p||!stackempty(S))
 {
 if (p)
 {
 push(S, p->data);
 p = p->lchild;
 }
 else
 {
 pop(S, p->data);
 visit(p);
 p = p->rchild;
 }
 }
 }
 4)后序遍历
 void postorder(BiTree T)
 {
 if (T != NULL)
 {
 postorder(T->lchild);
 postorder(T->rchild);
 visit(T);
 }
 }
 5)后序遍历非递归
 void postorder1(BiTree T)
 {
 Sqstack S;
 BiTNode *r,*p;
 //BiTree p;
 initstack(S);
 p = T;
 r = NULL;
 while (p||!stackempty(S))
 {
 if (p)
 {
 push(S, p->data);
 p = p->lchild;
 }
 else
 {
 pop(S, p->data);
 if (p->rchild&&p->rchild != r)
 {
 p = p->rchild;
 push(S, p->data);
 p = p->lchild;
 }
 else
 {
 pop(S, p->data);
 visit(p);
 r = p;
 p = NULL;
 }
 }
 }
 }
 6)层序遍历
 void levelorder(BiTree T)
 {
 Sqstack S;
 SqQueue Q;
 initqueue(Q);
 initstack(S);
 if(T!=NULL)
 {
 enqueue(Q, T->data);
 while (!queueempty(Q))
 {
 dequeue(Q,T->data);
 push(S, T->data);
 if (T->lchild != NULL)
 {
 enqueue(Q, T->lchild->data);
 }
 if (T->rchild != NULL)
 {
 enqueue(Q, T->rchild->data);
 }
 }
 while (!stackempty(S))
 {
 pop(S, T->data);
 visit1(T->data);
 }
 }
 }
10、二叉排序树非递归算法
 BiTNode *bstsearch(BiTree T, int key, BiTNode *&p)
 {
 p = NULL;
 while (T!=NULL&&key!=T->data)
 {
 p = T;
 if (key < T->data)
 {
 T = T->lchild;
 }
 else
 {
 T = T->rchild;
 }
 }
 return T;
 }
 11、二叉排序树的插入
 int bstinsert(BiTree &T, int k)
 {
 if (T == NULL)
 {
 T = (BiTree)malloc(sizeof(BiTNode));
 T->data = k;
 T->lchild = T->rchild = NULL;
 return 1;
 }
 else if (k == T->data)
 {
 return 0;
 }
 else if (k < T->data)
 {
 return bstinsert(T->lchild, k);
 }
 else
 {
 return bstinsert(T->rchild, k);
 }
 }
 12、二叉排序树的构造
 void bstcreate(BiTree &T, int str[], int n)
 {
 T = NULL;
 int i = 0;
 while (i<n)
 {
 bstinsert(T, str[i]);
 i++;
 }
 }
13、线索二叉树的存储结构
 typedef struct ThreadNode {
 int data;
 struct ThreadNode *lchild, *rchild;
 int ltag, rtag;
 }ThreadNode,*ThreadTree;
 void visit(ThreadTree T)
 {
 printf("遍历树");
 return;
 }
 1)求中序线索二叉树中中序序列下的第一个结点
 ThreadNode *firstnode(ThreadNode *p)
 {
 while (p->ltag==0)
 {
 p = p->lchild;
 }
 return p;
 }
 2)求中序线索二叉树中结点p在中序序列下的后继结点
 ThreadNode *nextnode(ThreadNode *p)
 {
 if (p->rtag == 0)
 {
 return firstnode(p->rchild);
 }
 else
 {
 return p->rchild;
 }
 }
 3)不含头结点的中序线索二叉树的中序遍历
 void inorder(ThreadNode *p)
 {
 for (ThreadNode *t = firstnode(p); t != NULL; t = nextnode(p))
 {
 visit(p);
 }
 }
 4)中序遍历对二叉树线索化的递归算法
 void inthread(ThreadTree &t, ThreadTree &pre)
 {
 if (t != NULL)
 {
 inthread(t->lchild, pre);
 if (t->lchild == NULL)
 {
 t->lchild = pre;
 t->ltag = 1;
 }
 if (pre != NULL && pre->rchild == NULL)
 {
 pre->rchild = t;
 pre->rtag = 1;
 }
 pre = t;
 inthread(t->rchild, pre);
 }
 }
 5)中序遍历建立中序线索二叉树
 void createinthread(ThreadTree T)
 {
 ThreadTree pre = NULL;
 if (T != NULL)
 {
 inthread(T, pre);
 pre->rchild = NULL;
 pre->rtag = 1;
 }
 }










