#include <stdio.h>
#include <string.h>
#include "knLinklist.h"
#include "knLinkstack.h"//二叉链表
typedef struct BiNode{int data;struct BiNode *lchild, *rchild;
}BiNode, *BiTree;#if 1
//找到向左走,找到中序遍历的起点
BiNode *goLeft(BiNode *T, LinkStack *s)
{if (T == NULL){return NULL;}//判断T有没有左孩子, 没有把T return ;//如果有 T入栈 ,再往左走while (T->lchild != NULL){LinkStack_Push(s, (void*)T);T = T->lchild;}return T;
}void inorder2(BiNode *T)
{BiNode *t = NULL;LinkStack * s = LinkStack_Create();t = goLeft(T, s); //如果结点有左子树, 该结点入栈;while (t){printf("%d ", t->data); //如果结点没有左子树,访问该结点(就是打印该节点);//如果 t有右子树 重复步骤1if (t->rchild != NULL){t = goLeft(t->rchild, s); //右子树中中序遍历的起点}else if (LinkList_Length(s) > 0){ //如果t没有右子树 根据栈顶指示 回退t = (BiNode*)LinkStack_Pop(s);}else{ //如果t没有右子树 并且栈为空,表示遍历结束t = NULL;}}
}//中序遍历 左根右 Middle order traversal
void inOrder(BiNode *root)
{if (root == NULL){return;}//遍历左子树inOrder(root->lchild);printf("%d ", root->data);//打印根//遍历右子树inOrder(root->rchild);
}/*t1/ \t2 t3/ /t4 t5
*/
void test()
{BiNode t1, t2, t3, t4, t5;memset(&t1, 0, sizeof(BiNode));memset(&t2, 0, sizeof(BiNode));memset(&t3, 0, sizeof(BiNode));memset(&t4, 0, sizeof(BiNode));memset(&t5, 0, sizeof(BiNode));t1.data = 1;t2.data = 2;t3.data = 3;t4.data = 4;t5.data = 5;//建立树关系t1.lchild = &t2; //t1的左孩子为t2t1.rchild = &t3; //t1的右孩子为t3t2.lchild = &t4; //t2的左孩子为t4t3.lchild = &t5; //t3的左孩子为t5printf("\n 中序遍历 inorder\n");inOrder(&t1);printf("\n\n 中序遍历 使用非递归算法\n");inorder2(&t1);
}
#endifint main()
{test();printf("\n---------hello\n");system("pause");
}