#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有右子树 重复步骤1
if (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的左孩子为t2
t1.rchild = &t3; //t1的右孩子为t3
t2.lchild = &t4; //t2的左孩子为t4
t3.lchild = &t5; //t3的左孩子为t5
printf("\n 中序遍历 inorder\n");
inOrder(&t1);
printf("\n\n 中序遍历 使用非递归算法\n");
inorder2(&t1);
}
#endif
int main()
{
test();
printf("\n---------hello\n");
system("pause");
}